Ошибки с задачей Visual Prolog 7.5
Формулировка задачи:
В общем сама задача
1. Корнеев, Докшин, Матвеев и Скобелев – жители одного города. Их профессии – пекарь, врач, инженер и офицер полиции. Корнеев и Докшин – соседи и всегда на работу ездят вместе. Докшин старше Матвеева. Корнеев регулярно обыгрывает Скобелева в пинг-понг. Пекарь на работу всегда ходит пешком. Офицер полиции не живет рядом с врачом. Инженер и офицер полиции встречались единственный раз, когда последний оштрафовал инженера за нарушение правил уличного движения. Офицер полиции старше врача и инженера. Определите, кто и чем занимается. (Ответ: офицер полиции – Скобелев; Матвеев – пекарь; Корнеев – врач; Докшин – инженер).
Хотел начать мучиться писать сам, но на этом форуме нашел код и переделываю ее под Visual Prolog 7.5, но она под старый пролог со старым синтаксисом..
Prolog - «Определите профессии» Сообщение №2
Мои наброски:
Ошибки на данный момент:
Просто напишите пожалуйста как исправить ошибки, сам тут очень слаб, уже час пытаюсь и не получается
Листинг программы
- implement main
- open core, console
- domains
- slist=string*.
- class predicates
- insert:(string[out],slist,slist[out])nondeterm .
- permutation:(slist,slist)nondeterm .
- profesii:(slist)nondeterm .
- solve:(slist)nondeterm .
- check:(string,string,string,string)nondeterm .
- clauses
- insert(X,L,[X|L]):- !.
- insert(X,[H|Tail],[H|NewTail]):-insert(X,Tail,NewTail).
- permutation([],[]):-!.
- permutation([H|Tail],L):-permutation(Tail,NewTail),insert(H,NewTail,L).
- profesii(L):-permutation(["pekar","vrach","inzener","milicioner"],L).
- check(A,B,A,B):-!.
- solve(Profesii):-profesii(Profesii),Profesii=[Korneev,Dokshin,Mareev,Skobelev],
- not(Korneev="pekar"),not(Dokshin="pekar"),
- not(check(Korneev,Dokshin,"milicioner","vrach")),not(check(Korneev,Dokshin,"vrach","milicioner")),
- not(check(Korneev,Dokshin,"milicioner","inzener")),not(check(Korneev,Dokshin,"inzener","milicioner")),
- not(check(Korneev,Skobelev,"milicioner","inzener")),not(check(Korneev,Skobelev,"inzener","milicioner")),
- not(check(Dokshin,Mareev,"vrach","milicioner")),not(check(Dokshin,Mareev,"inzener","milicioner")).
- run() :-
- solve([Korneev,Dokshin,Mareev,Skobelev]), write("Kornee - ",Korneev,"\nDokshin - ",Dokshin,"\nMareev - ",Mareev,"\nSkobelev - ",Skobelev),nl.
- end implement main
- goal
- console::run(main::run).
Решение задачи: «Ошибки с задачей Visual Prolog 7.5»
textual
Листинг программы
- implement main
- open core, console, string
- domains
- class facts
- man:(string).
- prof:(string).
- class predicates
- solve:(string, string) nondeterm anyflow.
- clauses
- man("Корнеев"). man("Докшин"). man("Матвеев").man("Скобелев").
- prof("Офицер"). prof("Пекарь"). prof("Врач").prof("Инженер").
- %Корнеев не пекарь и не офицер, потому что пекарь ходит пешком, а офицер не живет с врачом.
- solve(X, Y):- man(X), prof(Y),
- X="Корнеев"
- , Y<>"Пекарь", Y<>"Офицер".
- %Докшин не офицер потому что младше его и не пекарь потому что старше его.
- solve(X, Y):- man(X), prof(Y),
- X="Докшин"
- , Y<>"Офицер", Y<>"Пекарь".
- %Скобелев не инженер, потому что инженер либо Корнеев, Матвеев или Докшин
- solve(X, Y):- man(X), prof(Y),
- X="Скобелев"
- , Y<>"Инженер".
- %мареев не офицер потому что докшин старше мареева и Кореева
- solve(X, Y):- man(X), prof(Y),
- X="Матвеев"
- , Y<>"Офицер".
- solve(X, Y):- man(X), prof(Y).
- clauses
- run() :-
- init(),
- solve("Корнеев", Y1),
- solve("Докшин", Y2),
- solve("Матвеев", Y3),
- solve("Скобелев", Y4),
- Y1<>Y2, Y2<>Y3, Y1<>Y4,Y3<>Y4,Y2<>Y4,Y1<>Y3,
- write("Корнеев ", Y1), nl,write("Докшин ", Y2), nl,write("Матвеев ", Y3),nl,write("Скобелев ", Y4),_=readLine(),!;_=readLine().
- end implement main
- goal
- console::run(main::run).
Объяснение кода листинга программы
В данном коде на языке Prolog реализуется задача, связанная с принадлежностью людей к определенным профессиям и ограничениями между этими профессиями.
- В первой части кода определяются два домена:
man
(люди) иprof
(профессии). - Затем определяются три класса фактов:
man
,prof
иclass facts
. - Далее определяются три класса предикатов:
solve
иclauses
. - В части
clauses
задаются ограничения на профессии людей. Например, Корнеев не может быть пекарем или офицером, потому что пекарь ходит пешком, а офицер не живет с врачом. - В части
solve
задаются условия для определения профессий людей. Например, если человек - Корнеев, то его профессия не может быть инженером, потому что инженер либо Корнеев, либо Матвеев или Докшин. - В части
clauses
задаются условия для проверки ограничений между профессиями людей. Например, Матвеев не может быть офицером, потому что Докшин старше Мареева и Корнеева. - В части
run
задается функция, которая проверяет все ограничения и выводит результат на экран. - В части
goal
задается цель выполнения программы - запуск функцииrun
для модуляmain
. - В конце кода идет чтение строки с помощью функции
_=readLine()
. Таким образом, данный код реализует задачу, связанную с определением профессий людей и ограничений между этими профессиями.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д