Пролог DCG с аргументами - PullRequest
0 голосов
/ 14 мая 2019

Я не могу понять, как работать с DCG, используя аргументы.Предположим, что мы хотим использовать DCG для представления родителей и их детей, тогда мы можем сказать:

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

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

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

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

Затем вы можете запросить: ?- s([Peter, is, father, of, Guido], []). Что возвращает true.

Как можноЯ использую аргументы в DCG, говоря, возможно, father(name).

1 Ответ

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

Добавить аргументы легко, и я не удивлюсь, если вы сделаете это, как сделано ниже, но не сможете заставить запрос работать. Хитрость в этом заключается в том, чтобы знать, что DCG переводится в обычный Пролог, добавляя два дополнительных аргумента к каждому предикату, когда они переводятся в Пролог. Их можно назвать как угодно, я лично предпочитаю S0 и S для штата, но меняю их, если они имеют более конкретное значение.

Также следует отметить, что в следующем коде, поскольку имена начинаются с заглавных букв и они должны быть атомами, вместо использования peter атомы обозначаются ', например, 'Peter'.

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

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

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

s --> father(Father), verb(Verb), relation(Relation), child(Child). 
s --> mother(Father), verb(Verb), relation(Relation), child(Child).

Теперь, чтобы проверить ваш первый запрос:

?- s([Peter, is, father, of, Guido], []).
true ;
true ;
true ;
true.

Для других, читающих это, это тот же ответ без добавленных аргументов. Проверьте это, если у вас есть сомнения.

Теперь для запроса отца с добавленными скрытыми аргументами.

?- father(Father,S0,S).
Father = 'Peter',
S0 = [_5662|S].

Вы могли бы также сделать

?- father(Father,_,_).
Father = 'Peter'.

Примечание:

Лучший способ сделать это - использовать фразу / 2 или фразу / 3 , я говорю использовать, а не отвечать, потому что вы задали вопрос о том, как запросить предложение Отец, не используйте его для анализа данных или работы с предикатом фразы.

test :-
    DCG = father(Father),
    phrase(DCG,Input,Rest),
    format('Father: ~w~n',[Father]).

?- test.
Father: Peter
true.

или

?- phrase(father(Name),_).
Name = 'Peter'.

Это тоже работает

?- s(S0,S).
S0 = ['Peter', is, father, of, 'Guido'|S] ;
S0 = ['Peter', is, father, of, 'Claudia'|S] ;
S0 = ['Peter', is, mother, of, 'Guido'|S] ;
S0 = ['Peter', is, mother, of, 'Claudia'|S] ;
S0 = ['Isabel', is, father, of, 'Guido'|S] ;
S0 = ['Isabel', is, father, of, 'Claudia'|S] ;
S0 = ['Isabel', is, mother, of, 'Guido'|S] ;
S0 = ['Isabel', is, mother, of, 'Claudia'|S].

?- s(S0,[]).
S0 = ['Peter', is, father, of, 'Guido'] ;
S0 = ['Peter', is, father, of, 'Claudia'] ;
S0 = ['Peter', is, mother, of, 'Guido'] ;
S0 = ['Peter', is, mother, of, 'Claudia'] ;
S0 = ['Isabel', is, father, of, 'Guido'] ;
S0 = ['Isabel', is, father, of, 'Claudia'] ;
S0 = ['Isabel', is, mother, of, 'Guido'] ;
S0 = ['Isabel', is, mother, of, 'Claudia'].

?- phrase(s,S,[]).
S = ['Peter', is, father, of, 'Guido'] ;
S = ['Peter', is, father, of, 'Claudia'] ;
S = ['Peter', is, mother, of, 'Guido'] ;
S = ['Peter', is, mother, of, 'Claudia'] ;
S = ['Isabel', is, father, of, 'Guido'] ;
S = ['Isabel', is, father, of, 'Claudia'] ;
S = ['Isabel', is, mother, of, 'Guido'] ;
S = ['Isabel', is, mother, of, 'Claudia'].

Если вы используете перечисление / 0 , вы можете увидеть DCG, преобразованный в Prolog, который покажет два дополнительных аргумента, пронизанных через предикаты.

?- listing.  

child('Guido', ['Guido'|A], A).
child('Claudia', ['Claudia'|A], A).

verb(is, [is|A], A).

relation('father of', [father, of|A], A).
relation('mother of', [mother, of|A], A).

father('Peter', ['Peter'|A], A).
mother('Isabel', ['Isabel'|A], A).

s(A, B) :-
    father(Father, A, C),
    verb(Verb, C, D),
    relation(Relation, D, E),
    child(Child, E, B).
s(A, B) :-
    mother(Father, A, C),
    verb(Verb, C, D),
    relation(Relation, D, E),
    child(Child, E, B).

test :-
    DCG=father(Father),
    phrase(DCG, Input, Rest),
    format('Father: ~w~n', [Father]).

true.
...