我正在Prolog做一些功课,我必须使用类似的东西:
规则:
brothers(a,b)
brothers(c,d)
我必须实现查询brothers(b,a)
的能力,并且在数据库中没有重复的情况下才能生效。
我考虑使用:brothers(X,Y):- brothers(Y,X)
但它只是无限递归。我不知道我能做什么,因为两个名字必须相同。
答案 0 :(得分:3)
好吧,你必须打破无限递归!这可以通过各种方式完成:
1)订购
在每个brother(X,Y)
规则X>Y
中创建数据库。
然后,添加规则brother(X,Y):- Y>X, brother(Y,X).
2)包装器谓词
brother(X,Y):- brother_facts(X,Y) ; brother_facts(Y,X).
3)布线
如果您使用XSB(或其他一些支持它的prolog实现),则可能。
Tabling有点像memoization并将打破循环