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