Списки, рекурсия - Prolog

Узнай цену своей работы

Формулировка задачи:

Задача 1. Определите предикат, удаляющий из списка последний элемент. Задача 2. Определите предикат, удаляющий из каждый второй элемент.

Решение задачи: «Списки, рекурсия»

textual
Листинг программы
domains
int=integer
intl=int*
 
predicates
butLast(intl,intl)
delByNum(intl,intl,int,int)
delEven(intl,intl)
 
clauses
butLast([_],[]).
butLast([A|T],[A|R]) :- butLast(T,R).
 
delByNum([],[],_,_).
delByNum([H|T],[H|R],N,P) :- P < N, P1=P+1, delByNum(T,R,N,P1).
delByNum([_|T],R,N,N)     :- delByNum(T,R,N,1).
 
delEven(X,Y) :- delByNum(X,Y,2,1).

Объяснение кода листинга программы

  1. Списки представлены как intl (int*), то есть как упорядоченные последовательности целых чисел.
  2. В коде есть три предиката: butLast, delByNum, delEven.
  3. butLast([_],[]). - пустой список не содержит последнего элемента.
  4. butLast([A|T],[A|R]) :- butLast(T,R). - последний элемент списка T становится первым элементом списка R.
  5. delByNum([],[],,). - если список пустой, то он не содержит элемента с заданным номером (N,P).
  6. delByNum([H|T],[H|R],N,P) :- P < N, P1=P+1, delByNum(T,R,N,P1). - элемент с номером N в списке T становится элементом с номером P1 в списке R.
  7. delByNum([_|T],R,N,N) :- delByNum(T,R,N,1). - последний элемент списка T становится первым элементом списка R, если его номер равен N.
  8. delEven(X,Y) :- delByNum(X,Y,2,1). - список X без четных чисел становится списком Y.
  9. В коде используется рекурсия для обработки списков.

Оцени полезность:

8   голосов , оценка 4.375 из 5
Похожие ответы