我们如何在prolog中跟踪递归算法?

时间:2013-09-28 17:51:37

标签: recursion prolog

我发现它非常简单,但我认为我得到了它的要点,请确认我是否错了。

append([],L,L).
   append([H|T],L2,[H|L3])  :-  append(T,L2,L3). 

这是关于规则和跟踪的查询。

?-  append([a,b,c],[1,2,3],X) 

append([a,  b,  c],  [1,  2,  3],  _G518)
   append([b,  c],  [1,  2,  3],  _G587)
   append([c],  [1,  2,  3],  _G590)
   append([],  [1,  2,  3],  _G593)
   append([],  [1,  2,  3],  [1,  2,  3])
   append([c],  [1,  2,  3],  [c,  1,  2,  3])
   append([b,  c],  [1,  2,  3],  [b,  c,  1,  2,  3])
   append([a,  b,  c],  [1,  2,  3],  [a,  b,  c,  1,  2,  3])

   X  =  [a,  b,  c,  1,  2,  3]
   yes 

追加(T,L2,L3),“递归”前进,减小列表[H | T]的大小,然后追加([H | T],L2,[H | L3])“递归”向后,增加列表L3的大小。所以,如果我理解正确,规则总是向后“递归”,其条件“递归”,我是否正确?是什么让算法追加“递归”?它是否附加([],L,L)?或者它在到达基本情况后总是向后“递归”吗?

令人困惑的是,更简单的prolog递归只能“递归”前进。如果我没有错误的祖先(E,F)只是“递归”前进。

1 个答案:

答案 0 :(得分:0)

这是第三个参数,X,这里。它以大写字母开头,因此它是一个变量。 Prolog需要为这个变量找到一个值。

每次调用append([H|T], L2, [H|L3])时,都会调用append(T, L2, L3)

当调用append(T, L2, L3)时,Prolog将首先检查它是否适合append([], L, L),因为这是该程序的第一个子句。

如果不合适,Prolog将继续讨论第二个条款:append([H|T],L2,[H|L3])

如果第一个参数是空列表,则它适合:[]。如果已删除所有元素(在这种情况下为字母),则会发生这种情况。该子句将第二个参数L作为第三个参数返回。从头到尾,第二个参数始终保持[1,2,3]。它就在这一刻。

空列表[]是基本情况:递归不会从那里更深入,因为该子句没有再次调用append的主体。这是找到结果的第一个元素(第三个参数)的点:L是[1, 2, 3]。这个结果以L3的形式返回给调用它的append,它将它与它的[H|L3] [c, 1, 2, 3]结合起来。这反过来又被回到调用那个的append。这种结果的回馈一直持续到原始的,第一次被称为附加的结果。然后Prolog打印出来。

在跟踪中,您可以看到_G518等变量。在前三行中尚未到达基本情况,因此无法填写第三个参数(H已知但L3不是)。