Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Prolog如何处理这个查询_List_Prolog_Logic_Head_Tail - Fatal编程技术网

List Prolog如何处理这个查询

List Prolog如何处理这个查询,list,prolog,logic,head,tail,List,Prolog,Logic,Head,Tail,考虑到以下定义: 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]. 有人能帮我理解它是如何工作的吗?这就像是一个递归函数。 定义递归函数有两个步骤(1和2) my_append(A,B,C)获取两个列表A和B并构建一个列表,该列表是A和B元素的追加

考虑到以下定义:

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].

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

这就像是一个递归函数。 定义递归函数有两个步骤(1和2) my_append(A,B,C)获取两个列表A和B并构建一个列表,该列表是A和B元素的追加(称为结果C)。 这里第三个参数作为函数的结果(这不是真的,而是一个很好的一次近似)

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

在第一个列表为空的情况下,trivaly的结果是可以放入第二个参数中的所有内容

2) 递归情况。 my|u append([H|T],L[H|NewTail]):- 我的附加(T、L、新邮件)。

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

因此,日复一日,第一个arg越来越短,直到基本情况匹配为止

请注意,如果使用非绑定变量的参数调用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.
所以我们“去堆栈”


这是一个递归函数

它将第一个列表拆分为头几个部分,当它为空时,它将获取第二个列表,并依次将头添加到前面

您可以将其想象为对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([2,5], [3,4], L)
my_append([5], [3,4], L)
然后称为基本情况:

my_append([], [3,4], L)
然后按以下相反顺序返回:

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

L是[3,4],然后L是[5,3,4],然后L是[2,5,3,4],然后L是[1,2,5,3,4],函数结束。

这是人们学习的第一个Prolog程序。教科书上没有解释吗?