Задача:
Три друга – Петр, Роман и Сергей учатся на математическом, физическом
и химическом факультетах университета.
Если Петр математик, то Сергей не физик.
Если Роман не физик, то Петр – математик.
Если Сергей не математик, то Роман – химик.
Определите специальность Сергея.
Код:
domains
dep=symbol
predicates
faculty(dep)
cond1(dep, dep)
cond2(dep, dep)
cond3(dep, dep)
solve(dep, dep, dep) % Peter, Roman, Sergey
clauses
faculty(physics).
faculty(math).
faculty(chemistry).
cond1(Fa1, Fa3):-
Fa1=math,
Fa3<>physics.
cond2(Fa2, Fa1):-
Fa2<>physics,
Fa1=math.
cond3(Fa3, Fa2):-
Fa3<>math,
Fa2=chemistry.
solve(Fa1, Fa2, Fa3):-
faculty(Fa1),
faculty(Fa2),
faculty(Fa3),
Fa1<>Fa2,
Fa2<>Fa3,
Fa1<>Fa3,
cond1(Fa1, Fa3);
cond2(Fa2, Fa1);
cond3(Fa3, Fa2).
При запуске данного кода выскакивает следующая ошибка:
Как можно исправить данную ошибку и есть ли у этой задачки какое-либо другое решение на прологе?
Ответ у задачки должен быть такой: Петр - химик, Роман - физик, Сергей - математик
Ответ
Используй вместо <> конструкцию not(a=b).
domains
dep=symbol
predicates
faculty(dep)
cond1(dep, dep)
cond2(dep, dep)
cond3(dep, dep)
solve(dep, dep, dep) % Peter, Roman, Sergey
clauses
faculty(physics).
faculty(math).
faculty(chemistry).
cond1(Fa1, Fa2):-
Fa1=math,
not(Fa2=physics).
cond1(Fa1, _):-
not(Fa1=math).
cond2(Fa1, Fa2):-
not(Fa1=physics),
Fa2=math.
cond2(physics, _).
cond3(Fa1, Fa2):-
not(Fa1=math),
Fa2=chemistry.
cond3(math, _).
solve(Fa1, Fa2, Fa3):-
faculty(Fa1),
faculty(Fa2),
faculty(Fa3),
Fa1<>Fa2,
Fa2<>Fa3,
Fa1<>Fa3,
cond1(Fa1, Fa3),
cond2(Fa2, Fa1),
cond3(Fa3, Fa2).
goal
solve(Fa1, Fa2, Fa3),
write(Fa1),nl,
write(Fa2),nl,
write(Fa3).
Комментариев нет:
Отправить комментарий