循环Prolog

时间:2012-02-06 19:23:24

标签: prolog

我有以下prolog代码:

equiAngularTriangle(T) :-
    equiLateralTriangle(T).

equiLateralTriangle(T) :-
    equiAngularTriangle(T).

有没有办法让口译员不要两次问同一个问题?例如,如果我问equiAngularTriangle(t),那么它会问equiLateralTriangle(t),然后问equiLateralTriangle(t),但它应该知道不再追求最后一个,因为同样的问题在于“查询堆栈”。

是否有选项或某些特殊语法让Prolog按照我想要的方式运行?

2 个答案:

答案 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)等