如何在递归中分配变量?

时间:2017-10-26 06:10:40

标签: prolog

假设你在其他方框内有一堆盒子,即

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的值结束的。

1 个答案:

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

只是旁注:请注意您使用的条款。你没有“分配”变量,而是“统一”它们。你也不是在写“方法”,而是在写“谓词”。