Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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
Prolog 对于从列表谓词中删除这个特定查询的工作方式,有些人表示怀疑_Prolog - Fatal编程技术网

Prolog 对于从列表谓词中删除这个特定查询的工作方式,有些人表示怀疑

Prolog 对于从列表谓词中删除这个特定查询的工作方式,有些人表示怀疑,prolog,Prolog,我对该del/3谓词的查询工作方式有疑问: /* BASE CASE: If I delete X from List and X is the HEAD of List, NewList is the Tail of List */ del(X, [X|Tail], Tail). /* GENERAL CASE: If the head of List is not X then the program have to delete

我对该del/3谓词的查询工作方式有疑问:

/* BASE CASE: If I delete X from List and X is the HEAD of List, NewList is
              the Tail of List
*/
del(X, [X|Tail], Tail).

/* GENERAL CASE: If the head of List is not X then the program have to delete
                 X in the Tail of List
*/
del(X, [Y|Tail], [Y|Tail1]) :- del(X, Tail, Tail1).
 del([Top1|Stack1], Stacks, Stacks1).
谓词逻辑非常简单:从一个列表中删除X项创建一个没有X的新列表:如果X在列表的头部,那么newlist就是它的尾部。否则,如果X项不在列表的头部,请尝试在尾部中找到它(并删除),创建一个新的尾部Tail1

好的,我对谓词逻辑没有问题,但是我在理解这个查询的工作方式时遇到了一些问题(我必须在另一个程序中使用它):

因此,此查询必须从[[a,b,c],[]]中删除[Top1 | Stack1],这是一个堆栈列表(在这个特殊情况下,我有3个堆栈:[a,b,c]和2个空堆栈:[]),从而生成名为Stacks1的新堆栈列表

如果我尝试执行查询跟踪,我会得到以下结果:

[trace]  ?- del([Top1|Stack1], [[a,b,c],[],[]], Stacks1).
   Call: (7) del([_G389|_G390], [[a, b, c], [], []], _G412) ? creep
   Exit: (7) del([a, b, c], [[a, b, c], [], []], [[], []]) ? creep
Top1 = a,
Stack1 = [b, c],
Stacks1 = [[], []] .
我很难理解为什么:[Top1 | Stack1]与第一个堆栈统一[a,b,c]

编辑: 我认为可能是这样的:堆栈列表是:[[a,b,c],[]],这是一个列表列表,其中第一个列表是:[a,b,c](这是该列表的标题**

所以当我写:[Top1 | Stack1]时,会发生以下情况:

Top1=[a、b、c] *堆栈1=[],[]*

因此,Top1是堆栈列表中的第一个堆栈,Stack1是其他堆栈的列表

所以当我写谓词时:

/* BASE CASE: If I delete X from List and X is the HEAD of List, NewList is
              the Tail of List
*/
del(X, [X|Tail], Tail).

/* GENERAL CASE: If the head of List is not X then the program have to delete
                 X in the Tail of List
*/
del(X, [Y|Tail], [Y|Tail1]) :- del(X, Tail, Tail1).
 del([Top1|Stack1], Stacks, Stacks1).
(其中,例如:堆栈=[[a,b,c],[],[]]

它是这样工作的:

它将Top1与堆栈列表中的第一个堆栈统一起来:[a,b,c],并将其从堆栈中删除

当我执行一个简单的查询时,我的dount与Prolog语义相关,如下所示:

del(b, [a,b,c], NewList).
它从列表中删除b项,NewList=[a,c]


但是当我知道要删除的项的字段是这样的:[Head | Tail]是要删除的头项吗?

查询
D=[[a,b,c],[],[]],del([a | b],D,c)
D
的元素中选择任何与
[a | b]
匹配的列表。这里唯一的可能性是
[a | b]=[a,b,c]
剩下的是
c=[],[]]

一般来说,
del
完全回溯,一个接一个地找到所有的可能性。这里只有一种可能性

要更好地理解
del
,请尝试以下操作:

2 ?- del(X,[A,B,C],D).
X = A,
D = [B, C] ;
X = B,
D = [A, C] ;
X = C,
D = [A, B] ;
false.
它不是试图“查找”
X
;它只是从各种可能性中(第二个参数)一个接一个地选择它。这就是谓词所说的它是/所做的

当然,如果列表被实例化为基本术语,一些可能不匹配,将被拒绝,从而产生一种正在搜索的值的印象:

4 ?- del(b, [a,b,c,d], R).
R = [a, c, d] ;
false.

5 ?- del(b, [a,b,X,d], R).
R = [a, X, d] ;
X = b,
R = [a, b, d] ;
false.
术语
[A | B]
仅与任何非空列表(或逻辑变量)匹配:

因此,例如,
del([A | B],[1,2,3],[4,5],[6]],R)
将从这个示例调用的第二个参数中给出的4个列表中选择任何非空列表,当它这样做时,它将
A
绑定到head元素,
B
绑定到所选列表的其余元素

此谓词称为“在野外”:


说明:

del(X, [X|Tail], Tail).

     X        X
     --------------------
              T        T
              a        a
              i        i
              l        l

del(X, [Y|Tail], [Y|Tail1]) :- del(X, Tail, Tail1).

              Y        Y
     --------------------
              T        T
       /      .        a
     X -      .        i
       \      .        l
              .        1
              l

查询
D=[[a,b,c],[],[]],del([a | b],D,c)
D
的元素中选择任何与
[a | b]=[a,b,c]
匹配的列表。这里唯一的可能性是
[a | b]=[a,b,c]
,剩余的是
c=[[],[]

一般来说,
del
完全回溯,一个接一个地找到所有的可能性。这里只有一种可能性

要更好地理解
del
,请尝试以下操作:

2 ?- del(X,[A,B,C],D).
X = A,
D = [B, C] ;
X = B,
D = [A, C] ;
X = C,
D = [A, B] ;
false.
它不是试图“查找”
X
;它只是从各种可能性中(第二个参数)一个接一个地选择它。这就是谓词所说的它是/所做的

当然,如果列表被实例化为基本术语,一些可能不匹配,将被拒绝,从而产生一种正在搜索的值的印象:

4 ?- del(b, [a,b,c,d], R).
R = [a, c, d] ;
false.

5 ?- del(b, [a,b,X,d], R).
R = [a, X, d] ;
X = b,
R = [a, b, d] ;
false.
术语
[A | B]
仅与任何非空列表(或逻辑变量)匹配:

因此,例如,
del([A | B],[1,2,3],[4,5],[6]],R)
将从这个示例调用的第二个参数中给出的4个列表中选择任何非空列表,当它这样做时,它将
A
绑定到head元素,
B
绑定到所选列表的其余元素

此谓词称为“在野外”:


说明:

del(X, [X|Tail], Tail).

     X        X
     --------------------
              T        T
              a        a
              i        i
              l        l

del(X, [Y|Tail], [Y|Tail1]) :- del(X, Tail, Tail1).

              Y        Y
     --------------------
              T        T
       /      .        a
     X -      .        i
       \      .        l
              .        1
              l

现在情况对我来说更清楚了。我也开始看到select/3谓词和yes具有相同的行为。因此,关于它的最后一个问题(确保我已经很好地理解):当我做一些类似于:del([A | B],[1,2,3],[4,5],[6]],R)的事情时,会发生什么:第一次[A | B]匹配一个可以分解为头和尾的列表,所以删除这个列表并给我剩下的列表。例如,我在prolog shell中获得:R=[[4,5],[6]。然后,如果我在prolog shell中插入;字符,我将强制回溯,并对程序说,必须搜索另一个可以与[a | B]形式不匹配的列表,所以在前面的例子中,[A | B]与从列表列表中删除的列表[4,5]是统一的,因此根据回溯的经典逻辑,其余的是R=[[1,2,3],[6],[6]等等……对吗?Tnx太多了!!!不幸的是,由于工作原因,无法跟上课程的进度我必须打破这里的框框:-)现在情况对我来说更清楚了。我还继续看到select/3谓词和yes有相同的行为。所以关于它的最后一个问题(为了确保我理解清楚):当我做一些类似于del([A | B],[1,2,3],[4,5],[6]],R)的事情时会发生什么