2014-12-03 72 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