Мой код Swi-пролога возвращает true для каждого запроса - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь написать код Swi-Prolog для семейных отношений.Нет ошибки, но она всегда возвращает истину.P

man(_Pete).
man(_Mark).
man(_John).
man(_Frank).
man(_Tom).
man(_Matt).
man(_Henry).
man(_Todd).
woman(_Lilly).
woman(_Kate).
woman(_Anne).
woman(_Alice).
woman(_Jenny).

parent(_Pete,_Mark).
parent(_Pete,_Tom).
parent(_Pete,_Anne).
parent(_Mark,_Lilly).
parent(_Mark,_John).
parent(_Mark,_Frank).
parent(_Tom,_Kate).
parent(_Anne,_Alice).
parent(_Anne,_Matt).
parent(_Alice,_Henry).
parent(_Matt,_Jenny).
parent(_Matt,_Todd).


father(X,Y) :- man(X),parent(X,Y).
mother(X,Y) :- woman(X),parent(X,Y).
sibling(X,Y) :- parent(Z,X),parent(Z,Y).
sister(X,Y) :- woman(X),sibling(X,Y).
brother(X,Y) :- man(X), sibling(X,Y).
grandparent(X,Y) :- parent(X,Z),parent(Z,Y).

Я ожидаю проверить отношения.Например, если я попробую функцию? - родитель (Пит, Джон).Я считаю, что он должен возвращать false, но на самом деле он возвращает true для каждого запроса.Это моя первая программа на Прологе, и может понадобиться помощь, чтобы разобраться в проблеме.

1 Ответ

0 голосов
/ 18 февраля 2019

Вы, вероятно, хотели писать имена, но вместо этого вы помещаете туда анонимные переменные .

Вместо parent(_Matt,_Todd) вы должны написать parent('Matt', 'Todd') или даже parent(matt, todd).

  • Это анонимная переменная: _X.
  • Это нормальная переменная: X.
  • Это строчный атом.Он имеет длину 1, поэтому он также является "char": x.
  • Это символ верхнего регистра: 'X'.

Если выоберните что-нибудь в одинарные кавычки, это станет атомом.В нем также могут быть пробелы.

Если вы поместите подчеркивание впереди, вы получите анонимную переменную.Он заканчивается первым пробелом или оператором.

Если вы получаете предупреждения "Singleton variable", обычно это одна из двух вещей.

Начинающие часто имеют в виду писать 'Bob', но писать Bob вместо (без одинарных кавычек).

Вы определяете предикат и забыли использовать одну из переменных в нем.Вы должны либо сделать ее анонимной переменной, _Bob, если вы действительно не заботитесь об этом, либо найти в предикате, где вы должны ее использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...