Prolog 循环序言
我有以下prolog代码:Prolog 循环序言,prolog,Prolog,我有以下prolog代码: equiAngularTriangle(T) :- equiLateralTriangle(T). equiLateralTriangle(T) :- equiAngularTriangle(T). 有没有办法防止口译员重复问同一个问题?例如,如果我问等边三角形(t),它会问等边三角形(t),然后问等边三角形(t),但它应该知道不要再问最后一个问题,因为“查询堆栈”上也有同样的问题 是否有一个选项或一些特殊语法可以让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),您将使用一些包装器谓词如何检查该语句是否为真?您是否也有一个将完成此查询的规则?或者:它如何知道它是否是其中之一?