在Prolog中迭代到列表中的列表

在Prolog中迭代到列表中的列表,prolog,Prolog,我目前有以下代码,可将元素插入列表: listpicket(_,[],[k]). listpicket(K,[H|T],[K,H|L]) :- listpicket(K,T,L). 它目前产生以下结果: L = [k, a, k, b, k, [c, d], k, e, k] 但是,我试图让程序在[c,d]中插入一个k,如图所示: L = [k, a, k, b, k, [k, c, k, d, k], k, e, k] 我有一种感觉,我应该使用is_list来检查尾部是否是正确的

我目前有以下代码,可将元素插入列表:

listpicket(_,[],[k]).
listpicket(K,[H|T],[K,H|L]) :-
    listpicket(K,T,L).
它目前产生以下结果:

L = [k, a, k, b, k, [c, d], k, e, k]
但是,我试图让程序在[c,d]中插入一个k,如图所示:

L = [k, a, k, b, k, [k, c, k, d, k], k, e, k]

我有一种感觉,我应该使用is_list来检查尾部是否是正确的列表,然后在内部创建另一个递归来插入k元素,就像外部一样。但是,我对Prolog还很陌生,我正在尝试理解如何在listpicket方法中引入条件。

您需要检查列表的头
[k,a,k,b,k,[c,d],k,e,k]
是否包含任何列表。如果标题是一个列表,则将
k
添加到列表
[c,d]
结果列表是
[k,c,k,d]
。现在将这个结果列表添加到主列表中。我的方法附在下面

is_list1([_|_]).

addK([X],k,[k,X,k]).
addK([H|T],k,[k,H|T1]):- addK(T,k,T1).


addElement([],[]).
addElement([H|T],[H1|Z]):- is_list1(H) , addK(H,k,H1) , addElement(T,Z) .
addElement([H|T],[H|Z]):- \+is_list(H) , addElement(T,Z).
is_list1()
函数用于确定给定的头是否为列表

addK()
函数将头前后的
k
添加到指定给它的列表中

addElement()
is使用上述所有函数来实现您想要的目标

输出

您需要做的是将我的代码附加到您现有的代码中,应该如下所示

listpicket(_,[],[k]).
listpicket(K,[H|T],[K,H|L]) :-
    listpicket(K,T,L).

is_list1([_|_]).

addK([X],k,[k,X,k]).
addK([H|T],k,[k,H|T1]):- addK(T,k,T1).


addElement([],[]).
addElement([H|T],[H1|Z]):- is_list1(H) , addK(H,k,H1) , addElement(T,Z) .
addElement([H|T],[H|Z]):- \+is_list(H) , addElement(T,Z).

goal(X,FinalList):- listpicket(k,X,L) , addElement(L,FinalList).
输出


希望这对您有所帮助。

您实际需要做的是使用
is\u list
检查头部是否为列表。尾部保证是一个列表,而不是用于测试。这可以确保术语得到充分的实例化
listpicket(_,[],[k]).
listpicket(K,[H|T],[K,H|L]) :-
    listpicket(K,T,L).

is_list1([_|_]).

addK([X],k,[k,X,k]).
addK([H|T],k,[k,H|T1]):- addK(T,k,T1).


addElement([],[]).
addElement([H|T],[H1|Z]):- is_list1(H) , addK(H,k,H1) , addElement(T,Z) .
addElement([H|T],[H|Z]):- \+is_list(H) , addElement(T,Z).

goal(X,FinalList):- listpicket(k,X,L) , addElement(L,FinalList).
?- goal([1,2,[3,4],5],FinalList).
   FinalList = [k, 1, k, 2, k, [k, 3, k, 4, k], k, 5, k]

?- goal([a,b,[c,d],e],FinalList).
   FinalList = [k, a, k, b, k, [k, c, k, d, k], k, e, k]