在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]