Не могли бы Вы помочь осознать, в чем у меня ошибка в коде?
Очень нужно разобраться..
Задача:
Описать на Прологе базу знаний, содержащую следующую информацию:
Факты:
Алексей – сын Юрия,
Юрий – сын Ивана,
Сергей – сын Ивана,
Александр – сын Ивана,
Павел – сын Сергея.
Правила:
X является отцом Y, если Y – сын X
X является братом Y, если это два разных человека, но оба являются сыновьями одного и того же человека
X является дядей Y, если отцом Y является Z, а X и Z – братья
X является дедушкой Y, если X – отец Z, а Z – отец Y
Сформулировать цели и ответить на следующие вопросы:
Вывести список братьев Сергея
Как зовут дедушку Павла?
Кем приходится Сергей Алексею?
predicates
nondeterm son(string,string) /*who, whose*/
nondeterm father(string,string) /*who, whose*/
nondeterm brother(string,string) /*who, whose*/
nondeterm uncle(string,string) /*(who, whose*/
nondeterm grandfather(string,string) /*who, whose*/
clauses
%Facts
son(aleksej,yurij).
son(yurij,ivan).
son(sergej,ivan).
son(alexandr,ivan).
son(pavel,sergej).
%Rules
father(X,Y):-son(Y,X).
brother(X,Y):-X<>Y,father(Z,X),father(Z,Y).
uncle(X,Y):-father(Z,Y), brother(X,Z),brother(Z,X).
grandfather(X,Y):-father(X,Z),father(Z,Y).
goal
brother(X,sergej).
grandfather(X,pavel).
X(sergej,aleksej).
Вроде бы всё логично, должно скомпилироваться и выдать результат, но почему-то выдает ошибки..
Не понимаю, что не так..
Ответ
Сразу стоит заметить, что здесь решать задачи за вас не будут.
Теперь по сути.
Очевидно, что у вас нет предиката X(Y,Z), который бы приводил в соответствие каждой ситуации родства слово кем является Y для Z.
Пример такого предиката:
Who(Y,Z,X):-brother(Y,Z), X="brother",
Who(Y,Z,X):-father(Y,Z), X="father",
...
И так описать все возможные ситуации для этого предиката, не забыть и про племянников и внуков. Разумеется, код может быть не рабочим, так как для Prolog уйма различных вариаций интерпретаторов языка.
Но идея общая дана.
P.S. В том интерпретаторе с которым работал я должен был быть только один goal, не уверен насчёт вашего.