3

Не могли бы Вы помочь осознать, в чем у меня ошибка в коде? Очень нужно разобраться..

Задача:
Описать на Прологе базу знаний, содержащую следующую информацию:
Факты:

  1. Алексей – сын Юрия,
  2. Юрий – сын Ивана,
  3. Сергей – сын Ивана,
  4. Александр – сын Ивана,
  5. Павел – сын Сергея.

Правила:

  1. X является отцом Y, если Y – сын X
  2. X является братом Y, если это два разных человека, но оба являются сыновьями одного и того же человека
  3. X является дядей Y, если отцом Y является Z, а X и Z – братья
  4. X является дедушкой Y, если X – отец Z, а Z – отец Y

Сформулировать цели и ответить на следующие вопросы:

  1. Вывести список братьев Сергея
  2. Как зовут дедушку Павла?
  3. Кем приходится Сергей Алексею?
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).

Вроде бы всё логично, должно скомпилироваться и выдать результат, но почему-то выдает ошибки..
Не понимаю, что не так..

Grundy
  • 81,538
Gadget
  • 135
  • как минимум нужно добавить в вопрос ошибки, которые ты получаешь – Grundy Nov 08 '16 at 07:03
  • X(sergej,aleksej) - у тебя нет предиката X – Grundy Nov 08 '16 at 07:04
  • и еще непонятная конструкция: brother(X,Z),brother(Z,X) - у тебя же без разницы в каком порядке аргументы передавать – Grundy Nov 08 '16 at 07:06
  • Ошибка: E;Test_Goal, pos: 589, 450 Syntax error, section keyword expected – Gadget Nov 08 '16 at 07:07
  • Это на какую строку из приведенного кода ругается? – Grundy Nov 08 '16 at 07:08
  • Можете подсказать, как следует исправить код, чтобы он заработал, скомпилировался? – Gadget Nov 08 '16 at 07:08
  • да вот сама не понимаю на какую он ругается, учитывая, что у меня не так много строк .. Эта ошибка появляется в Visual Prolog v.5.2 Personal Edition for Windows 32 – Gadget Nov 08 '16 at 07:13
  • Если попробовать вбить этот код на сайты онлайн-компиляторов для языка Пролог, то тогда будет указывать на конкретные строки.. В эти онлайн-компиляторы вбивала код: http://swish.swi-prolog.org/ , http://ideone.com/70keHI – Gadget Nov 08 '16 at 07:15
  • @Gadget откуда взят этот код? – Anatol Nov 08 '16 at 07:17
  • 1
    откуда? написан мной – Gadget Nov 08 '16 at 07:19
  • Как минимум цель(goal) должна быть одна. А у тебя три написано. Кроме этого в разных версиях компиляторов разные операторы сравнения. Ну и про то, что нет предиката X я уже говорил – Grundy Nov 08 '16 at 07:25
  • а как можно переписать тогда третью цель (кем приходится Сергей Алексею)? Если так нельзя это выяснить :"X(sergej,aleksej)"? – Gadget Nov 08 '16 at 07:35
  • Переписала так цель :"brother(X,sergej), write(X), nl, grandfather(Y,pavel), write(Y), nl" Теперь могу получить ответ для первых двух вопросов, но не знаю, как вывести ответ для третьего вопроса (кем приходится Сергей Алексею).. – Gadget Nov 08 '16 at 07:36
  • Как это можно сделать? – Gadget Nov 08 '16 at 07:37
  • Если вам дан исчерпывающий ответ, отметьте его как верный (галка напротив выбранного ответа). – Nicolas Chabanovsky Nov 09 '16 at 05:51

1 Answers1

3

Сразу стоит заметить, что здесь решать задачи за вас не будут. Теперь по сути. Очевидно, что у вас нет предиката 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, не уверен насчёт вашего.

Gordory
  • 573