假设你在其他方框内有一堆盒子,即
inBox(a,b).
inBox(b,c).
inBox(c,d).
inBox(x,y)表示框x在框y中。现在我想写一个方法来确定一个盒子是否在另一个盒子里面,例如insideBox(a,d)= true因为a在b里面,在c里面,在d里面。因此它似乎是一个自然递归的问题,我尝试解决它无法将我的变量初始化为"移动一个框":
insideBox(X, Y) :- inBox(X, Y), inBox(X, Z), insideBox(Z,Y).
逻辑是首先检查框X是否当前在框Y内的基本情况,如果没有,则调用inBox(X,Z)以获得X框所在的值,然后调用递归方法。我已经尝试过查看跟踪但无法推断出正在发生的事情:
| ?- insideBox(a,d).
1 1 Call: insideBox(a,d) ? c
2 2 Call: inBox(a,d) ? c
2 2 Fail: inBox(a,d) ? c
1 1 Fail: insideBox(a,d) ? c
我已经尝试过其他类似Z的内容(X,_)用于设置变量Z但是它还没有工作,我也不知道Z是如何以a的值结束的。
答案 0 :(得分:2)
试试这个:
?- insideBox(a,d).
inBox(a,b).
inBox(b,c).
inBox(c,d).
insideBox(X,Z) :- inBox(X,Z).
insideBox(X,Z) :- inBox(X,Y), insideBox(Y,Z).
只是旁注:请注意您使用的条款。你没有“分配”变量,而是“统一”它们。你也不是在写“方法”,而是在写“谓词”。