2014-12-03 38 views
0

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

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

+1

revappend(A,B,C)有什么问题: - 追加(B,A,C)。而对于你的“给我的结果就像......”你没有说出输入是什么。所以这有点不清楚。 – lurker 2014-12-03 17:12:40

回答

-1

你想要颠倒列表的顺序并追加它们,或者更准确地说,你想追加第二个列表与第一个列表,这里是prolog规则来做同样的事情。

append(List,[],List). 
append(List,[Head|Tail],[Head|Res]):-append(List,Tail,Res). 

第一条规则说,当第二个列表为空时,您会将第一个列表追加到结果中。

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

+1

谢谢。它工作,我现在明白了:) – learner 2014-12-03 04:40:20

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

revappend([X | Xs],[],[X | Zs]): - revappend(Xs,[],Zs)。这条规则对我来说不是很清楚。我认为这个规则解释了如果第二个列表为空,那么第二个列表附加到第一个列表并获得第一个列表的结果,因为我只是新的学习者,我用事实解释它:revappend([X | Xs],[]] ,[X | Xs])。我错了吗? – limonik 2015-09-08 20:08:49