我正在为练习做随机问题而且我一直遇到与列表相同的小问题。出于某种原因,当我插入/追加/修改List时,我在List的末尾不断得到一个管道符号。一个这样的代码示例,对我这样做:
insertBetween([], E, []).
insertBetween([X], E, X).
insertBetween([X|Xs], E, [X, E | Zs]):- insertBetween(Xs, E, Zs).
我尝试以下命令:
insertBetween([1,2,3], 0, Res).
返回为:Res = [1,0,2,0 | 3]。
为什么我得到这个答案时我会得到Res = [1,0,2,0,3]?我做基本情况错了吗?在过去的几周里,我开始不喜欢这个程序了......大声笑。
答案 0 :(得分:2)
insertBetween([X], E, X).
^ ^
所以X是列表和列表的元素。
答案 1 :(得分:2)
除了@ false的答案,即使你写道:
insertBetween([X], E, [X]).
代替insertBetween([X], E, X).
你得到:
?- insertBetween([1,2,3], 0, Res).
Res = [1, 0, 2, 0, 3] ;
Res = [1, 0, 2, 0, 3, 0].
因为第二个和第三个规则/条款都可以成功地给出不同的结果,所以你需要使第三个子句与第二个不同,如:
insertBetween([], _, []).
insertBetween([X], _, [X]).
insertBetween([X,Y|Xs], E, [X, E | Zs]):- insertBetween([Y|Xs], E, Zs).
这给出了:
?- insertBetween([1,2,3], 0, Res).
Res = [1, 0, 2, 0, 3] ;
false.
请注意,如果列表至少包含两个元素但第二个子句只有一个然后第二个子句成功,则第三个子句有效。例如:insertBetween([], E, []).
,其中未使用E,最好将其替换为insertBetween([], _, []).