2012-02-06 99 views
2

我有以下序言代码:循环的Prolog

equiAngularTriangle(T) :- 
    equiLateralTriangle(T). 

equiLateralTriangle(T) :- 
    equiAngularTriangle(T). 

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

是否有一个选项或一些特殊的语法让Prolog按照我想要的方式工作?

+2

如何检查该陈述是否属实?你是否也有一个规则来完成这个查询?否则:它是如何知道它是否是其中之一? – Marnix 2012-02-06 19:39:42

回答

1

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

通常你会使用一些包装谓词如果不是富(T)你有foo1( T),foo2(T)等

1

尝试XSB Prolog。它实现了表格,这将在您的情况下进行短路评估。尽管如此,你需要告诉它哪些谓词应该被放置。