Я пытаюсь написать предикат, который дал следующий список в Прологе:Пользовательские реверс списка в Прологе
[[1,a,b],[2,c,d],[[3,e,f],[4,g,h],[5,i,j]],[6,k,l]]
будет производить следующий список:
[[6,k,l],[[5,i,j],[4,g,h],[3,e,f]],[2,c,d],[1,a,b]]
Как вы можете видеть, я хотели бы сохранить порядок элементов на самом низком уровне, чтобы создать элементы в порядке 1, a, b и NOT b, a, 1.
Я также хотел бы сохранить глубину списков, которые есть, списки, которые являются origi nally вложенные возвращаются как таковые, но в обратном порядке. не
мне удалось достичь желаемого порядка с помощью следующего кода, но глубина теряется, то есть списки больше не вложены правильно:
accRev([F,S,T],A,R) :- F \= [_|_], S \= [_|_], T \= [_|_],
accRev([],[[F,S,T]|A],R).
accRev([H|T],A,R) :- accRev(H,[],R1), accRev(T,[],R2), append(R2,R1,R).
accRev([],A,A).
rev(A,B) :- accRev(A,[],B).
Я был бы признателен за помощь в исправлении кода для сохранения правильного вложенность списков. Благодаря!
Спасибо! Я использовал второй вариант и заменил 'is_list (L)' на '(L == []; L = [_ | _])', как и вы, для M, поскольку 'is_list/1' недоступен в GNU Prolog , Очень признателен! – sentinel
Ха-ха, кричит! Я рад, что смогу помочь. Я отредактирую определение второго предложения об удалении 'is_list/1', поскольку я намерен опустить любые встроенные модули. Ура! – sharky