我有以下prolog代码:
equiAngularTriangle(T) :-
equiLateralTriangle(T).
equiLateralTriangle(T) :-
equiAngularTriangle(T).
有没有办法让口译员不要两次问同一个问题?例如,如果我问equiAngularTriangle(t)
,那么它会问equiLateralTriangle(t)
,然后问equiLateralTriangle(t)
,但它应该知道不再追求最后一个,因为同样的问题在于“查询堆栈”。
是否有选项或某些特殊语法让Prolog按照我想要的方式运行?
答案 0 :(得分:1)
试试XSB Prolog。它实现了表格,这将像你的情况一样短路评估。但是,你需要告诉它哪些谓词应该被提交。
答案 1 :(得分:1)
如果prolog实现支持制表或您正在使用XSB,那么您可以使用它并获得所需的行为。
您还可以添加州参数:
%State = [Checked_for_equiAngular, Checked_for_equiLateral]
equiAngularTriangle(T, [_,false]) :-
equiLateralTriangle(T, [true,true]).
equiLateralTriangle(T, [false,_]) :-
equiAngularTriangle(T, [true,true]).
当然你需要修改其余的条款。
最后一个(也是最好的imo)选项是重写谓词。我想你的代码与这个例子类似:
ang(T):-
foo(T).
ang(T):-
lat(T).
lat(T):-
bar(T).
lat(T):-
ang(T).
所以你可以写一下:
ang(T):-
foo(T).
ang(T):-
bar(T).
lat(T):-
ang(T).
通常你会使用一些包装谓词而不是foo(T)你有foo1(T),foo2(T)等