我是prolog的新手。我试图颠倒列表的顺序并附加它们。
例如:
revappend([1,2],[3,4],X)应该给我的结果如下:
X = [3,4,1,2]
我写的代码:
revappend([],List,List).
revappend(InputListB,[Head|InputListA], [Head|OutputList]):-
revappend( InputListA, InputListB, OutputList).
给我结果如:
X = [15,11,16,12,13,14]
有人可以告诉我该怎么做吗?
答案 0 :(得分:1)
我不清楚问题陈述。如果你想要的是
revappend( [1,2] , [3,4] , L ) .
生成,如您的示例所示:
L = [3,4,1,2]
解决方案很简单:
revappend( Xs , Ys , Zs ) :- append(Ys,Xs,Zs) .
如果您不想或不能使用内置的append/3
,您可能会执行以下操作:
revappend( [] , [] , [] ) .
revappend( Xs , [Y|Ys] , [Y|Zs] ) :- revappend( Xs , Ys , Zs ) .
revappend( [X|Xs] , [] , [X|Zs] ) :- revappend( Xs , [] , Zs ) .
然而,当我听到你的问题陈述之类的话时:
我试图颠倒列表的顺序并附加它们。
我希望你的
revappend( [1,2] , [3,4] , L ) .
会产生L = [2,1,4,3]
或L = [4,3,2,1]
。
对于前一个([2,1,4,3]
)的情况,你可能会这样写:
revappend( Xs, Yz , Zs ) :- revappend(Xs,Yz,[],Zs) .
revappend( [] , [] , Zs , Zs ) .
revappend( [X|Xs] , Ys , Rs , Zs ) :- revappend(Xs,Ys,[X|Rs],Zs).
revappend( [] , [Y|Ys] , Rs , Zs ) :- revappend([],Ys,[Y|Rs],Zs).
对于后者([4,3,2,1]
),您只需稍微改变一下,沿着以下几行修改revappend/4
:
revappend( [] , [] , Zs , Zs ) .
revappend( Xs , [Y|Ys] , Rs , Zs ) :- revappend(Xs,Ys,[Y|Rs],Zs).
revappend( [X|Xs] , [] , Rs , Zs ) :- revappend(Xs,[],[X|Rs],Zs).
请注意,您也可以使用内置插件执行此操作:
revappend(Xs,Ys,Zs) :-
reverse(Xs,X1) ,
reverse(Ys,Y1) ,
append(X1,Y1,Zs)
.
答案 1 :(得分:-1)
你想要颠倒列表的顺序并附加它们,或者更准确地说你想要附加第一个列表的第二个列表,这里是prolog规则来做同样的事情。
append(List,[],List).
append(List,[Head|Tail],[Head|Res]):-append(List,Tail,Res).
第一条规则说当第二个列表为空时,你要将第一个列表附加到结果中。
第二个规则说你要将第二个列表的头部添加到结果中,并递归地将第二个列表的尾部附加到第一个列表中。