Prolog 循环序言

Prolog 循环序言,prolog,Prolog,我有以下prolog代码: equiAngularTriangle(T) :- equiLateralTriangle(T). equiLateralTriangle(T) :- equiAngularTriangle(T). 有没有办法防止口译员重复问同一个问题?例如,如果我问等边三角形(t),它会问等边三角形(t),然后问等边三角形(t),但它应该知道不要再问最后一个问题,因为“查询堆栈”上也有同样的问题 是否有一个选项或一些特殊语法可以让Prolog按照我希望的方式运行

我有以下prolog代码:

equiAngularTriangle(T) :-
    equiLateralTriangle(T).

equiLateralTriangle(T) :-
    equiAngularTriangle(T).
有没有办法防止口译员重复问同一个问题?例如,如果我问
等边三角形(t)
,它会问
等边三角形(t)
,然后问
等边三角形(t)
,但它应该知道不要再问最后一个问题,因为“查询堆栈”上也有同样的问题


是否有一个选项或一些特殊语法可以让Prolog按照我希望的方式运行?

试试看。它实现了表格化,这将像您的案例中那样短路评估。但是,您需要告诉它哪些谓词应该被表化。

如果prolog实现支持表化,或者您正在使用XSB,那么您可以使用它并获得所需的行为

还可以添加状态参数:

%State = [Checked_for_equiAngular, Checked_for_equiLateral]

equiAngularTriangle(T, [_,false]) :-
    equiLateralTriangle(T, [true,true]).

equiLateralTriangle(T, [false,_]) :-
    equiAngularTriangle(T, [true,true]).
当然,您需要修改其余的条款

最后(也是最好的)选择是重写谓词。我猜您的代码将类似于此示例:

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).

通常,如果有foo1(T)、foo2(T)等,而不是foo(T),您将使用一些包装器谓词

如何检查该语句是否为真?您是否也有一个将完成此查询的规则?或者:它如何知道它是否是其中之一?