Предикаты для работы со списками - 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 и [].

  1. Предикат p1:
    • Если H пустой список ([]), то результат будет пустой список [].
    • Если H не пустой список, то:
      • Проверяется, существует ли P для H. Если нет, то результат будет пустой список [].
      • Если P существует для H, то рекурсивно вызывается p1 для T, P и R.
  2. Предикат p2:
    • Если H пустой список ([]), то результат будет пустой список [].
    • Если H не пустой список, то:
      • Проверяется, существует ли P для H. Если нет, то результат будет пустой список [].
      • Если P существует для H, то рекурсивно вызывается p2 для T, P и R. Оба предиката используют ! в конце для прекращения поиска.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

6   голосов , оценка 3.667 из 5