Задачи по прологу из учебника - Prolog
Формулировка задачи:
Помогите разобраться пжлста с задачами с учебника, задачи даны там тестом, нужно выбрать правильный вариант программы к заданию, это я сделал опытным путем, то есть запустил их в турбоПрологе, но как они работают не очень понимаю, где что выполняется. Завис на этих задачах в конце параграфа, а пока с этим не разберусь, не хочу идти дальше, ибо будет еще сложней потом. Но у самого меня не получается продвинуться, поэтому прощу помощи
Два множества представлены списками. Найти вычитание множеств.
Из произвольного списка и числового списка построить новый список:
(A B C) (1 2 3) —> ((A) (B B) (C C C))
Листинг программы
- domains
- list=integer*
- predicates
- com(integer,list)
- dif(list,list,list)
- clauses
- com(x,[x|_]).
- com(x,[_|y]):-com(x,y).
- dif([],_,[]).
- dif([h|t],l1,[h|l2]):-
- not(com(h,l1)),
- dif(t,l1,l2).
- dif([h|t],l1,l2):-
- com(h,l1),
- dif(t,l1,l2).
Листинг программы
- domains
- list1 = symbol*
- list2 = integer*
- list3 = list1*
- predicates
- sprd(symbol,integer,list1)
- pred(list1,list2,list3)
- clauses
- pred([],_,[]):-!.
- pred(_,[],[]):-!.
- pred([A|B],[C|D],G):-sprd(A,C,E),pred(B,D,F),
- G=[E|F].
- sprd(_,0,[]).
- sprd(A,B,[A|C]):-B>0,D=B-1,sprd(A,D,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).
- рекурсивный случай для вычисления разности списков, когда в первом списке есть элемент, который отсутствует во втором списке
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д