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

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

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

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

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

textual
Листинг программы
  1. domains
  2. i=integer
  3. mn=i*
  4. predicates
  5. member(i,mn)
  6. intersection(mn,mn,mn)
  7. minus(mn,mn,mn)
  8. delete_all(i,mn,mn)
  9. list_set(mn,mn)
  10. start(mn)
  11. rezult(mn,mn,mn,mn)
  12. clauses
  13. member(X,[X|_]):-!.
  14. member(X,[_|T]):-member(X,T).
  15. minus([],_,[]).
  16. minus([Z|T],S2,S):-member(Z,S2),!, minus(T,S2,S).
  17. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут