我试图以递归的方式将列表的头部附加到原子上,但是prolog一直在返回false,我无法确定原因。
我的原始代码:
listpicket(K, [H1|T1], L) :-
append([K], [H1], L),
listpicket(K, T1, L).
运行如:
?- listpicket(k, [a,b,c], L).
预期产出:
[k, a, k, b, k, c].
实际输出:
false.
怀疑false
来自最后一次递归迭代,其中没有尾部(T1
,这里),我试着像这样处理这个案例:
listpicket(K, [H1|T1], L) :-
(
not(is_list(T1)),
[K|T1]
);
append([K], [H1], L),
listpicket(K, T1, L).
但我也得到了false
。
我做错了什么?
答案 0 :(得分:0)
失败的原因是,当您第二次调用append/3
时,您必须拥有一个未实例化的变量,但此时L已被实现。
append/3
说给我两个列表和一个变量/未实例化,我将返回连接列表。
您可以像这样调整代码:
`
listpicket(K, [H1|T1], [NewL|L]) :-
append([K], [H1], NewL),
listpicket(K, T1, L).`
和基本情况:
listpicket(_,[],[]).
此代码可以使用,但您仍然无法获得预期的结果,因为您在列表中创建了列表。每次append/3
返回一个列表,我们将其添加为列表的头部。
好吧,我会像这样解决这个问题:
listpicket(_,[],[]).
listpicket(K,[H|T],[K,H|L]):-
listpicket(K,T,L).