Задачи по прологу из учебника - 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).
Объяснение кода листинга программы
domains
- определение типов данных переменныхpredicates
- определение пользовательскихpredicatesmember(i,mn)
- проверка является ли элементi
частью спискаmn
intersection(mn,mn,mn)
- нахождение пересечения трех списковminus(mn,mn,mn)
- вычитание одного списка из другогоdelete_all(i,mn,mn)
- удаление всех вхождений элементаi
из спискаmn
list_set(mn,mn)
- установка значения элемента спискаmn
start(mn)
- запуск выполнения программыrezult(mn,mn,mn,mn)
- получение результата выполнения программыmember(X,[X|_]):-!.
- базовый случай для рекурсивного вызова при проверке является ли элементX
частью списка[X|_]
, где!
- это оператор прекращения выполнения целиmember(X,[_|T]):-member(X,T).
- рекурсивный случай для проверки является ли элементX
частью списка[_|T]
, гдеT
- это список, от которого произведен отбор элементов[_|T]
minus([],_,[]).
- базовый случай для вычисления разности списков, когда первый список пустminus([Z|T],S2,S):-member(Z,S2),!, minus(T,S2,S).
- рекурсивный случай для вычисления разности списков, когда в первом списке есть элемент, который присутствует во втором спискеminus([Z|T],S2,[Z|S]):-minus(T,S2,S).
- рекурсивный случай для вычисления разности списков, когда в первом списке есть элемент, который отсутствует во втором списке
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д