Предикаты для работы со списками - Prolog
Формулировка задачи:
Помогите, пожалуйста, с задачей.
Написать предикат p(+L, + P, -R), который в качестве результата выдает список, состоящий из всех элементов списка L, начинает с начала списка и до первого элемента, не удовлетворяющего данному предикату P. Например:
?- p([2, 4, 6, a, 8, 9], number, X).
X=[2, 4, 6];
No
Решение задачи: «Предикаты для работы со списками»
textual
Листинг программы
p1([], _, []). p1([H|_], P, []) :- \+ call(P, H). p1([H|T], P, [H|R]) :- call(P, H), p1(T, P, R). p2([], _, []). p2([H|_], P, []) :- \+ call(P, H), !. p2([H|T], P, [H|R]) :- p2(T, P, R).
Объяснение кода листинга программы
Код представляет собой два предиката p1 и p2, которые работают с тремя аргументами: [H|_], P и [].
- Предикат p1:
- Если H пустой список ([]), то результат будет пустой список [].
- Если H не пустой список, то:
- Проверяется, существует ли P для H. Если нет, то результат будет пустой список [].
- Если P существует для H, то рекурсивно вызывается p1 для T, P и R.
- Предикат p2:
- Если H пустой список ([]), то результат будет пустой список [].
- Если H не пустой список, то:
- Проверяется, существует ли P для H. Если нет, то результат будет пустой список [].
- Если P существует для H, то рекурсивно вызывается p2 для T, P и R. Оба предиката используют ! в конце для прекращения поиска.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д