2014-12-03 1 views
0

Я новичок в прологе. Я пытаюсь изменить порядок списка и добавить его.Пролог программы для вспять и добавления списка

Например:

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): - append (B, A, C) .'? И для вашего «Давать мне результат, как ...» вы не сказали, какие были исходные данные. Так что это немного неясно. – lurker

ответ

-1

вы хотите изменить порядок списка и добавить их или, точнее, хотите добавить второй список с первым списком, а вот это правило пролога сделать то же самое.

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

1-е правило гласит, что, когда 2-й список пуст, вы присоедините первый список к результату.

Второе правило гласит, что вы добавите во второй список результат и рекурсивно добавите хвост второго списка в первый список.

+1

Спасибо. Он работает, и я понял сейчас :) – learner

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