Ошибки с задачей Visual Prolog 7.5
Формулировка задачи:
В общем сама задача
1. Корнеев, Докшин, Матвеев и Скобелев – жители одного города. Их профессии – пекарь, врач, инженер и офицер полиции. Корнеев и Докшин – соседи и всегда на работу ездят вместе. Докшин старше Матвеева. Корнеев регулярно обыгрывает Скобелева в пинг-понг. Пекарь на работу всегда ходит пешком. Офицер полиции не живет рядом с врачом. Инженер и офицер полиции встречались единственный раз, когда последний оштрафовал инженера за нарушение правил уличного движения. Офицер полиции старше врача и инженера. Определите, кто и чем занимается. (Ответ: офицер полиции – Скобелев; Матвеев – пекарь; Корнеев – врач; Докшин – инженер).
Хотел начать мучиться писать сам, но на этом форуме нашел код и переделываю ее под Visual Prolog 7.5, но она под старый пролог со старым синтаксисом..
Prolog - «Определите профессии» Сообщение №2
Мои наброски:
Ошибки на данный момент:
Просто напишите пожалуйста как исправить ошибки, сам тут очень слаб, уже час пытаюсь и не получается
Решение задачи: «Ошибки с задачей 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(). Таким образом, данный код реализует задачу, связанную с определением профессий людей и ограничений между этими профессиями.