考虑了如下定义:如何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].
有人能帮助我理解它是如何工作的?
考虑了如下定义:如何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].
有人能帮助我理解它是如何工作的?
这项工作就像一个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)
这是一个递归函数。
它将第一个列表拆分成头件,当它为空时,它将第二个列表并将头部连续添加到前面。
可以按如下想象这是多次调用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],函数结束。
这是任何人学习的首批Prolog程序之一。这不是在教科书中解释的吗? – Barmar