所以我有Prolog代码在给定位置插入一个元素:
ins(Val, [H|List], Pos, [H|Res]):-
Pos > 1,
!,
Pos1 is Pos - 1,
ins(Val, List, Pos1, Res).
ins(Val, List, 1, [Val|List]).
这给出了输出
28 ?- ins(B, [A,C,D], 4, Z).
Z = [A, C, D, B].
工作正常。
现在我想在列表的开头重用这段代码。
addFirst(Val, [H|List], [H|Res]):-
ins(Val, [H|List], 1, [H|Res]).
这给了我一个输出
41 ?- addFirst(A, [B,C,D], Z).
A = B,
Z = [B, B, C, D].
有人可以帮助我为什么会这样吗?我是Prolog的新手。
答案 0 :(得分:2)
这个错误是对H的过度分享...更简洁更好:这是有效的
addFirst(Val,List,Res):-
ins(Val,List,1,Res).
答案 1 :(得分:0)
你应该看看第n [0,1] / 4:
?- nth0(3, R, z, [a,b,c] ).
R = [a, b, c, z].
这可能会有所帮助。
答案 2 :(得分:0)
您遇到的问题是您的代码没有正确反映您的意图。
addFirst(Value, List, Result) :-
ins(Value, List, 1, Result).
如果您想要将值添加为列表的第一个,请将其插入位置1的列表中。这就是上述声明所说的内容以及所需的全部内容。
你注意到的错误源于两个错误。
第一个是addFirst
的规则。
addFirst(Val,[H|List],[H|Res]):-
ins(Val,[H|List],1,[H|Res]).
这表明两个列表的头部应该相同。换句话说,您有一个列表[H|List]
,您在第一个位置添加Val
,并且您希望结果为[H|Res]
。这种情况发生的唯一方法是,要添加的值是要添加到的列表的头部。
这是第二个错误发挥作用的地方。
41 ?- addFirst(A,[B,C,D],Z).
A = B,
Z = [B, B, C, D].
您使用的是大写字母。大写字母表示变量。因此,Prolog解释器尝试以一种使addFirst(A,[B,C,D],Z)
为真的方式为这些变量赋值。正如我们刚刚看到的那样,这必然意味着列表的头部必须等于添加的值,因此A = B
,这是回复的第一部分。第二部分是结果列表,它是列表(由变量组成!)[B, B, C, D]
。
如果您使用小写字母作为列表和新元素,则此查询将失败。
41 ?- addFirst(a,[b,c,d],Z).
No.