Задачи по прологу из учебника - Prolog

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

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

Помогите разобраться пжлста с задачами с учебника, задачи даны там тестом, нужно выбрать правильный вариант программы к заданию, это я сделал опытным путем, то есть запустил их в турбоПрологе, но как они работают не очень понимаю, где что выполняется. Завис на этих задачах в конце параграфа, а пока с этим не разберусь, не хочу идти дальше, ибо будет еще сложней потом. Но у самого меня не получается продвинуться, поэтому прощу помощи Два множества представлены списками. Найти вычитание множеств.
Из произвольного списка и числового списка построить новый список: (A B C) (1 2 3) —> ((A) (B B) (C C C))

Решение задачи: «Задачи по прологу из учебника»

textual
Листинг программы
domains
i=integer
mn=i*
predicates
member(i,mn)
intersection(mn,mn,mn)
minus(mn,mn,mn)
delete_all(i,mn,mn)
list_set(mn,mn)
start(mn)
rezult(mn,mn,mn,mn)
clauses
member(X,[X|_]):-!.
member(X,[_|T]):-member(X,T).
minus([],_,[]). 
minus([Z|T],S2,S):-member(Z,S2),!, minus(T,S2,S). 
minus([Z|T],S2,[Z|S]):-minus(T,S2,S).

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

  1. domains - определение типов данных переменных
  2. predicates - определение пользовательскихpredicates
  3. member(i,mn) - проверка является ли элемент i частью списка mn
  4. intersection(mn,mn,mn) - нахождение пересечения трех списков
  5. minus(mn,mn,mn) - вычитание одного списка из другого
  6. delete_all(i,mn,mn) - удаление всех вхождений элемента i из списка mn
  7. list_set(mn,mn) - установка значения элемента списка mn
  8. start(mn) - запуск выполнения программы
  9. rezult(mn,mn,mn,mn) - получение результата выполнения программы
  10. member(X,[X|_]):-!. - базовый случай для рекурсивного вызова при проверке является ли элемент X частью списка [X|_], где ! - это оператор прекращения выполнения цели
  11. member(X,[_|T]):-member(X,T). - рекурсивный случай для проверки является ли элемент X частью списка [_|T], где T - это список, от которого произведен отбор элементов [_|T]
  12. minus([],_,[]). - базовый случай для вычисления разности списков, когда первый список пуст
  13. minus([Z|T],S2,S):-member(Z,S2),!, minus(T,S2,S). - рекурсивный случай для вычисления разности списков, когда в первом списке есть элемент, который присутствует во втором списке
  14. minus([Z|T],S2,[Z|S]):-minus(T,S2,S). - рекурсивный случай для вычисления разности списков, когда в первом списке есть элемент, который отсутствует во втором списке

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


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

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

11   голосов , оценка 4.545 из 5