Prolog程序反转并附加列表

时间:2014-12-03 04:24:41

标签: prolog

我是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]

有人可以告诉我该怎么做吗?

2 个答案:

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

第一条规则说当第二个列表为空时,你要将第一个列表附加到结果中。

第二个规则说你要将第二个列表的头部添加到结果中,并递归地将第二个列表的尾部附加到第一个列表中。