我有以下紧凑示例,它采用 3 个参数 L1、L2、L3 并在 L3 中附加 L1 和 L2(验证 L3 是 L1 和 L2 的串联)
我有这段代码(效果很好):
myappend([], L, L).
myappend([X|L1], L2, [X|L]) :- myappend(L1,L2,L).
事实是基本情况,当第一个列表是一个空列表时,第一个列表与第二个列表的连接就是第二个列表。
好的,这很清楚......规则对我来说很清楚(但一点也不)我可以认为这条规则是测试第一个,第二个和第三个参数是否具有第一个和第二个连接关系的谓词争论
好的,我正在尝试以扩展形式表达前面的代码,其中我有这个规则的主体,它表示之前必须满足的所有谓词(必须为 TRUE),以便规则的头部本身得到满足.
我在 SWI Prolog 中实现此代码时遇到一些问题,这是我的代码:
concatena([],L,L).
/* REGOLA */
concatena(L1,L2,L3) :- L1 = [_|T], /* Always true: anonymous variable: "_" unifies everything */
concatena(T,L2,L3). /* Recursively call on the tail of L1 */
[X|L1],
[X|L3].
事实是基本情况(如前面的工作示例)
在我的实验中,规则是不同的。
为了验证规则的头部,它的主体中的所有谓词都必须为真......
我认为在达到基本情况之前我的想法是好的,实际上是在做:
L1 = [_|T], /* It is always true */
concatena(T,L2,L3) /* Call recursively on a subproblem of the original problem, this problem have one less element
好的,这样就达到了基本情况,因此 L3 与 L2 正确统一
事实上,在我的跟踪中:
[trace] 3 ?- concatena([a,b],[c,d],L3).
Call: (6) concatena([a, b], [c, d], _G1514) ? creep
Call: (7) [a, b]=[_G1592|_G1593] ? creep
Exit: (7) [a, b]=[a, b] ? creep
Call: (7) concatena([b], [c, d], _G1514) ? creep
Call: (8) [b]=[_G1595|_G1596] ? creep
Exit: (8) [b]=[b] ? creep
Call: (8) concatena([], [c, d], _G1514) ? creep
Exit: (8) concatena([], [c, d], [c, d]) ?
(这与我查看原始工作示例的痕迹时发生的事情相同......所以直到这里应该更正)
问题是当程序做回溯时,不工作!!!
实际上,在跟踪中我有这个(这是结束先前不完整跟踪的方式):
Exit: (7) concatena([b], [c, d], [c, d]) ? creep
Exit: (6) concatena([a, b], [c, d], [c, d]) ? creep
L3 = [c, d]