2013-07-22 2 views
2

tl: dr - У меня есть одна строка пролога, которая отлично работает в одной версии Prolog (SWI) но не в другом (TuProlog).Prolog/tuprolog, единственная строка, которая возвращает строку «enitire [sic] не может быть прочитана как один термин«

Я переношу скрипт из пролога SWI в Tuprolog. (Недавно TuProlog сделал большое обновление, и я получил одно и то же поведение в обеих версиях)

Когда я помещал скрипт в TuProlog с помощью установки java ниже, я получаю сообщение об ошибке «Строка enitire не может быть прочитана как один термин».

Так я срубил скрипт (эффективно используя бинарный поиск), пока я не уменьшить сценарий для:

iterm3(Term) --> "'", notquote(Cs), "'", { name(Term1,Cs), Term = q(Term1) }. 

который идет хотя swipl штрафа, со следующим выходом ...

cobrakai:~ josephreddington$ swipl -s /Users/josephreddington/Documents/workspace/com.plancomps.prolog.helloworld/caml-light-dynamics/Tools/Prolog/temp.pl% library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 3,992 bytes% /Users/josephreddington/Documents/workspace/com.plancomps.prolog.helloworld/caml-light-dynamics/Tools/Prolog/temp.pl compiled 0.00 sec, 1,720 bytes 
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 5.10.5) 
Copyright (c) 1990-2011 University of Amsterdam, VU Amsterdam 
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, 
and you are welcome to redistribute it under certain conditions. 
Please visit http://www.swi-prolog.org for details. 

For help, use ?- help(Topic). or ?- apropos(Word). 

?- 

Но все же возвращается «Строка enitire не может быть прочитана как один термин» в Tuprolog - может ли кто-нибудь сказать мне, почему это может произойти?

ПРИЛОЖЕНИЕ: КОД ИСПОЛЬЗУЕТСЯ:

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import alice.tuprolog.NoMoreSolutionException; 
import alice.tuprolog.NoSolutionException; 
import alice.tuprolog.Prolog; 
import alice.tuprolog.SolveInfo; 
import alice.tuprolog.Theory; 

public class EntireStringForStackOverflow { 
    public static void main(String[] args) throws Exception { 
     Prolog engine = new Prolog(); 
     engine.loadLibrary("alice.tuprolog.lib.DCGLibrary"); 
     engine.addTheory(new Theory(readFile("temp.pl"))); 
    } 

    private static String readFile(String file) throws IOException { 
     BufferedReader reader = new BufferedReader(new FileReader(file)); 
     String line = null; 
     StringBuilder stringBuilder = new StringBuilder(); 
     String ls = System.getProperty("line.separator"); 
     while ((line = reader.readLine()) != null) { 
      stringBuilder.append(line); 
      stringBuilder.append(ls); 
     } 
     return stringBuilder.toString(); 
    } 
} 

ответ

0

Я думаю, может быть, что кавычка должна быть указана в Tuprolog. Я хотел бы попробовать

iterm3(Term) --> "\'", notquote(Cs), "\'", { name(Term1,Cs), Term = q(Term1) }. 

редактировать Теперь я должен признать, что я не знаю, где документация tuProlog DCGs может быть, и я также не могу потратил слишком много поиска (я мог прочитать его, на самом деле). Другая модификация вашей грамматики, где вы можете понять, почему я предложил бесполезную модификацию выше:

iterm3(Term) --> ['\''], notquote(Cs), ['\''], { name(Term1,Cs), Term = q(Term1) }. 

То есть, проверить с помощью примерки и обанкротиться, если двойные кавычки константы запрещены в tuProlog ...

+0

Пробовал, но такую ​​же ошибку я боюсь :( – Joe

0

Вообще говоря, правильный способ записи терминов, содержащих одинарные кавычки в tuProlog, является верхним, то есть «» (или просто для того, чтобы предоставить другой смешанный пример «a'b»). Тем не менее, такие термины в настоящее время не обрабатываются Библиотекой DCG