2013-06-03 59 views
1

讓我有些序言...Tuprolog和定義綴運營商

cobrakai$more operator.pl 
be(a,c). 
:-op(35,xfx,be). 



+=(a,c). 
:-op(35,xfx,+=). 
cobrakai$ 

其中定義了一些綴運營商。我運行使用SWI序言和得到以下(完美預期)導致

?- halt. 
cobrakai$swipl -s operator.pl 
% library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 3,992 bytes 
% /Users/josephreddington/Documents/workspace/com.plancomps.prolog.helloworld/operator.pl compiled 0.00 sec, 992 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). 

?- be(a,c). 
true. 

?- a be c. 
true. 

?- +=(a,c). 
ERROR: toplevel: Undefined procedure: (+=)/2 (DWIM could not correct goal) 
?- halt. 
cobrakai$swipl -s operator.pl 
% library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 3,992 bytes 
% /Users/josephreddington/Documents/workspace/com.plancomps.prolog.helloworld/operator.pl compiled 0.00 sec, 1,280 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). 

?- be(a,c). 
true. 

?- a be c. 
true. 

?- +=(a,c). 
true. 

?- a += c. 
true. 

?- halt. 

然而,當我使用Tuprolog以處理來自Java的同一個文件(使用下面的代碼)

​​

序言它文件不解析 - 在'+ ='標記上失敗。

Exception in thread "main" alice.tuprolog.InvalidTheoryException: Unexpected token '+=' 
    at alice.tuprolog.TheoryManager.consult(TheoryManager.java:193) 
    at alice.tuprolog.Prolog.addTheory(Prolog.java:242) 
    at Testinfixoperatorconstruction.main(Testinfixoperatorconstruction.java:14) 

我們可以嘗試一個稍微不同的方法,直接在java代碼...

公共靜態無效的主要(字串[] args)將運營商拋出異常{ 的Prolog引擎=新的Prolog (); engine.loadLibrary(「alice.tuprolog.lib.DCGLibrary」);

engine.getOperatorManager().opNew("be", "xfx", 35); 
engine.getOperatorManager().opNew("+=", "xfx", 35); 
engine.addTheory(new Theory(
     readFile("/Users/josephreddington/Documents/workspace/com.plancomps.prolog.helloworld/operator2.pl"))); 
SolveInfo info = engine.solve("be(a,c)."); 
System.out.println(info.getSolution()); 
info = engine.solve("a be c."); 
System.out.println(info.getSolution()); 

}

,但我們得到了同樣的錯誤... :(

誰能告訴我爲什麼發生這種情況?(和解決方案也將受到歡迎)。

+0

也許Tuprolog不支持,請注意它似乎有一個[操作員管理類](http://grepcode.com/file/repo1.maven.org/ maven2的/ it.unibo.alice.tuprolog/tuprolog/2.1.1 /愛麗絲/ tuprolog/OperatorManager.java#OperatorManager)。那個錯誤是一個詞法(tokenizer)錯誤,所以它顯然不期望新的標記,並且沒有用它的詞法分析器註冊它。 – Orbling

回答

0

SWI -Prolog在解析指令時可能過於寬鬆,請嘗試在括號之間包含運算符:

:-op(35,xfx,(+=)). 

編輯我試過使用2p.jar,這讓我發現問題。需要引用運營商的原子:

:-op(35,xfx, '+='). 

X += Y. 
p :- a += b. 

互動2P控制檯接受此語法。注意:默認情況下,負載tuprolog是2p.jar

+0

這是一個不錯的主意,謝謝你的回答,但我擔心它沒有幫助:( – Joe

+0

SWI在這裏不是「太寬鬆」,也不需要括號和括號:': - op(35, xfx,+ =)。'是有效的ISO Prolog語法。 – false