将字符附加到字符

时间:2017-12-05 04:58:21

标签: prolog

我试图以递归的方式将列表的头部附加到原子上,但是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

我做错了什么?

1 个答案:

答案 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).