Задачи по прологу из учебника - 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частью спискаmnintersection(mn,mn,mn)- нахождение пересечения трех списковminus(mn,mn,mn)- вычитание одного списка из другогоdelete_all(i,mn,mn)- удаление всех вхождений элементаiиз спискаmnlist_set(mn,mn)- установка значения элемента спискаmnstart(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).- рекурсивный случай для вычисления разности списков, когда в первом списке есть элемент, который отсутствует во втором списке