Ошибки с задачей Visual Prolog 7.5

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

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

В общем сама задача 1. Корнеев, Докшин, Матвеев и Скобелев – жители одного города. Их профессии – пекарь, врач, инженер и офицер полиции. Корнеев и Докшин – соседи и всегда на работу ездят вместе. Докшин старше Матвеева. Корнеев регулярно обыгрывает Скобелева в пинг-понг. Пекарь на работу всегда ходит пешком. Офицер полиции не живет рядом с врачом. Инженер и офицер полиции встречались единственный раз, когда последний оштрафовал инженера за нарушение правил уличного движения. Офицер полиции старше врача и инженера. Определите, кто и чем занимается. (Ответ: офицер полиции – Скобелев; Матвеев – пекарь; Корнеев – врач; Докшин – инженер). Хотел начать мучиться писать сам, но на этом форуме нашел код и переделываю ее под Visual Prolog 7.5, но она под старый пролог со старым синтаксисом.. Prolog - «Определите профессии» Сообщение №2 Мои наброски:
Листинг программы
  1. implement main
  2. open core, console
  3. domains
  4. slist=string*.
  5. class predicates
  6. insert:(string[out],slist,slist[out])nondeterm .
  7. permutation:(slist,slist)nondeterm .
  8. profesii:(slist)nondeterm .
  9. solve:(slist)nondeterm .
  10. check:(string,string,string,string)nondeterm .
  11. clauses
  12. insert(X,L,[X|L]):- !.
  13. insert(X,[H|Tail],[H|NewTail]):-insert(X,Tail,NewTail).
  14. permutation([],[]):-!.
  15. permutation([H|Tail],L):-permutation(Tail,NewTail),insert(H,NewTail,L).
  16. profesii(L):-permutation(["pekar","vrach","inzener","milicioner"],L).
  17. check(A,B,A,B):-!.
  18. solve(Profesii):-profesii(Profesii),Profesii=[Korneev,Dokshin,Mareev,Skobelev],
  19. not(Korneev="pekar"),not(Dokshin="pekar"),
  20. not(check(Korneev,Dokshin,"milicioner","vrach")),not(check(Korneev,Dokshin,"vrach","milicioner")),
  21. not(check(Korneev,Dokshin,"milicioner","inzener")),not(check(Korneev,Dokshin,"inzener","milicioner")),
  22. not(check(Korneev,Skobelev,"milicioner","inzener")),not(check(Korneev,Skobelev,"inzener","milicioner")),
  23. not(check(Dokshin,Mareev,"vrach","milicioner")),not(check(Dokshin,Mareev,"inzener","milicioner")).
  24. run() :-
  25. solve([Korneev,Dokshin,Mareev,Skobelev]), write("Kornee - ",Korneev,"\nDokshin - ",Dokshin,"\nMareev - ",Mareev,"\nSkobelev - ",Skobelev),nl.
  26. end implement main
  27. goal
  28. console::run(main::run).
Ошибки на данный момент: Просто напишите пожалуйста как исправить ошибки, сам тут очень слаб, уже час пытаюсь и не получается

Решение задачи: «Ошибки с задачей Visual Prolog 7.5»

textual
Листинг программы
  1. implement main
  2.     open core, console, string
  3. domains
  4.  
  5. class facts
  6. man:(string).
  7. prof:(string).
  8. class predicates
  9. solve:(string, string) nondeterm anyflow.
  10. clauses
  11. man("Корнеев"). man("Докшин"). man("Матвеев").man("Скобелев").
  12. prof("Офицер"). prof("Пекарь"). prof("Врач").prof("Инженер").
  13.  
  14. %Корнеев не пекарь и не офицер, потому что пекарь ходит пешком, а офицер не живет с врачом.
  15.  
  16. solve(X, Y):- man(X), prof(Y),
  17. X="Корнеев"
  18. , Y<>"Пекарь", Y<>"Офицер".
  19.  
  20. %Докшин не офицер потому что младше его и не пекарь потому что старше его.
  21. solve(X, Y):- man(X), prof(Y),
  22. X="Докшин"
  23. , Y<>"Офицер", Y<>"Пекарь".
  24.  
  25. %Скобелев не инженер, потому что инженер либо Корнеев, Матвеев или Докшин
  26. solve(X, Y):- man(X), prof(Y),
  27. X="Скобелев"
  28. , Y<>"Инженер".
  29.  
  30. %мареев не офицер потому что докшин старше мареева и Кореева
  31. solve(X, Y):- man(X), prof(Y),
  32. X="Матвеев"
  33. , Y<>"Офицер".
  34.  
  35.  
  36.  
  37. solve(X, Y):- man(X), prof(Y).
  38.  
  39. clauses
  40. run() :-
  41. init(),
  42. solve("Корнеев", Y1),
  43. solve("Докшин", Y2),
  44. solve("Матвеев", Y3),
  45. solve("Скобелев", Y4),
  46. Y1<>Y2, Y2<>Y3, Y1<>Y4,Y3<>Y4,Y2<>Y4,Y1<>Y3,
  47. write("Корнеев ",  Y1), nl,write("Докшин ", Y2), nl,write("Матвеев ", Y3),nl,write("Скобелев ", Y4),_=readLine(),!;_=readLine().
  48. end implement main
  49.  
  50. goal
  51. console::run(main::run).

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

В данном коде на языке Prolog реализуется задача, связанная с принадлежностью людей к определенным профессиям и ограничениями между этими профессиями.

  1. В первой части кода определяются два домена: man (люди) и prof (профессии).
  2. Затем определяются три класса фактов: man, prof и class facts.
  3. Далее определяются три класса предикатов: solve и clauses.
  4. В части clauses задаются ограничения на профессии людей. Например, Корнеев не может быть пекарем или офицером, потому что пекарь ходит пешком, а офицер не живет с врачом.
  5. В части solve задаются условия для определения профессий людей. Например, если человек - Корнеев, то его профессия не может быть инженером, потому что инженер либо Корнеев, либо Матвеев или Докшин.
  6. В части clauses задаются условия для проверки ограничений между профессиями людей. Например, Матвеев не может быть офицером, потому что Докшин старше Мареева и Корнеева.
  7. В части run задается функция, которая проверяет все ограничения и выводит результат на экран.
  8. В части goal задается цель выполнения программы - запуск функции run для модуля main.
  9. В конце кода идет чтение строки с помощью функции _=readLine(). Таким образом, данный код реализует задачу, связанную с определением профессий людей и ограничений между этими профессиями.

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


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

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

9   голосов , оценка 4.222 из 5

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

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

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