2013-05-21 35 views
-1

考虑了如下定义:如何Prolog的处理这个查询

my_append([], L, L). 
my_append([H|T], L, [H|NewTail]):- 
my_append(T, L, NewTail). 

和可能的用途,它的输出:

?- my_append([1,2,5], [3,4], L). 
L = [1, 2, 5, 3, 4]. 

有人能帮助我理解它是如何工作的?

+3

这是任何人学习的首批Prolog程序之一。这不是在教科书中解释的吗? – Barmar

回答

0

这项工作就像一个recusive功能。 有两个步骤(1 & 2)来定义递归函数 my_append(A,B,C)取两个列表A & B并构建一个列表,它是A和B元素的附加元素(称为此结果C) 。 这里第三个参数作为函数的结果(这不是真的,但是是一个好的第一个近似)。

1)基本情况。 my_append([],L,L)。

在第一个Liste为空的情况下,trivaly的结果是所有可以放入第二个参数的结果。

2)递归的情况。 my_append([H | T],L,[H | NewTail]): - my_append(T,L,NewTail)。

在第一个列表不为空的情况下,第一个列表的形式是[Head | Tail],我们希望该头部是我们结果的头部(第三个参数)。 第二行给出了如何构建结果的结尾的详细信息。 结果的尾部/尾部是缩短的第一个参数和第二个参数的附加值:这是递归;问题是使用它自己的定义来表达,但在列表中巫婆是一个更短的元素。

因此,日复一日,第一个参数越来越短,直到基本情况匹配。

请注意,如果您使用不是绑定变量的参数(如果您更喜欢知道变量)调用my_append(),那么结果可能是不确定的:即每个调用都将返回一个不同的解决方案,直到没有更多的解决方案。

我所说的方法是这样的:

my_append([1,2],[3,4],L) 

和与之相匹配

my_append([1,2],[3,4],[1,2,3,4]) 


it's logicals implication are given by : 
my_append([1,2],[3,4],L) => match 2) 
so the reduction is : 
    my_append([1,2],[3,4],[1,I]) 
where my_append([2],[3,4],I) must be reduce. 

my_append([2],[3,4],I) => match 2) 
so the reduction is : 
    my_append([2],[3,4],[1,2,J]) 
where my_append([],[3,4],J) must be reduce. 

my_append([],[3,4],K) => match 1) 
so the reduction is : 
    my_append([],[3,4],[3,4]) where all variables are know/bind. 

,所以我们 “去堆栈”

K = [3,4]  (base case) 
J = [3,4]  (recursion case) 
I = [2,3,4] (recursion case) 
L = [1,2,3,4] (call) 
0

这是一个递归函数。

它将第一个列表拆分成头件,当它为空时,它将第二个列表并将头部连续添加到前面。

可以按如下想象这是多次调用my_append:

my_append([1,2,5], [3,4], L) 

的呼叫:

my_append([2,5], [3,4], L) 

的呼叫:

my_append([5], [3,4], L) 

然后调用基本情况:

my_append([], [3,4], L) 

这然后以相反的顺序返回如下:

L是[3,4],则L是[5,3,4],则L是[2,5,3,4] ,那么L是[1,2,5,3,4],函数结束。