我对这个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).
谓词逻辑非常简单:从列表中删除 X 项创建一个没有 X 的新列表:如果 X 在列表的头部,则新列表是它的尾部。否则,如果 X 项不在列表的头部,尝试在 Tail 中找到它(并删除)创建一个新的尾部 Tail1。
好的,所以我对谓词逻辑没有问题,但我在尝试理解这个查询的工作方式时遇到了一些问题(我必须在另一个程序中使用它):
del([Top1|Stack1], [[a,b,c],[],[]], Stacks1).
所以这个查询必须从堆栈列表[[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] * Stack1 = [[],[]] *
碰巧Top1是堆栈列表中的第一个堆栈,而Stack1是其他堆栈的列表。
所以当我写谓词时:
del([Top1|Stack1], Stacks, Stacks1).
(例如:Stacks = [[a,b,c],[],[]])
它以这种方式工作:
它将 Top1 与堆栈列表中的第一个堆栈统一起来:[a,b,c]并将其从堆栈列表中删除...
当我执行一个简单的查询时,我的问题与 Prolog 语义有关:
del(b, [a,b,c], NewList).
它从列表中删除 b 项和 NewList=[a,c]
但是当我知道要删除的项目的字段类似于:[Head|Tail]是要删除的 Head 项目吗?