Пролог DCG с переменными - PullRequest
2 голосов
/ 16 мая 2019

У меня есть предложения DCG с двумя лицами, представляющими мужчину и женщину.Я хочу сослаться на человека, упомянутого в предыдущем предложении, используя «он» или «она».

Предположим, у нас есть следующие DCG:

father --> [Peter].
mother --> [Isabel].

child --> [Guido].
child --> [Claudia].

verb --> [is].
relation --> [father, of].
relation --> [mother, of].

pronoun --> [he].
pronoun --> [she].

adjective --> [a, male].
adjective --> [a, female].

s --> father, verb, relation, child.
s --> mother, verb, relation, child.
s --> pronoun, verb, adjective.

Запрос ?- s([Peter, is, father, of, Guido], []). возвращает true.

Как я могу убедиться, что, когда я сейчас запрашиваю ?- s([he, is, a, male], []).должен возвращать true только потому, что я уже упомянул Питера (мужчину) в предыдущем предложении.В противном случае он должен вернуть false.

Этот вопрос использует тот же пример, что и здесь .

1 Ответ

2 голосов
/ 16 мая 2019

Вы можете увеличить свою DCG, чтобы сохранить некоторое состояние (пол последнего предложения):

father --> ['Peter'].
mother --> ['Isabel'].

child --> ['Guido'].
child --> ['Claudia'].

verb --> [is].
relation --> [father, of].
relation --> [mother, of].

pronoun(he) --> [he].
pronoun(she) --> [she].

adjective --> [a, male].
adjective --> [a, female].

s(G) --> s(none,G).

s(_,he) --> father, verb, relation, child.
s(_,she) --> mother, verb, relation, child.
s(G,G) --> pronoun(G), verb, adjective.

И теперь вы можете связывать запросы, используя это состояние:

?- phrase(s(G1),['Peter', is, father, of, 'Guido']), phrase(s(G1,G2),[he, is, a, male]).
G1 = G2, G2 = he

Возможно, вы захотите немного изменить DCG, чтобы ограничить отношения (используя параметр Gender). Например, вы, DCG, в настоящее время принимаете 'Peter' is mother of 'Guido', что, я не уверен, было задумано.

...