обработка отношений в прологе - PullRequest
1 голос
/ 03 ноября 2010
rel(X,Y) :- dep(X,Y).
rel(X,Y) :- aux(X,Y).
rel(X,Y) :- auxpass(X,Y).
rel(X,Y) :- cop(X,Y).
rel(X,Y) :- conj(X,Y).
rel(X,Y) :- cc(X,Y).
rel(X,Y) :- arg(X,Y).
rel(X,Y) :- subj(X,Y).
rel(X,Y) :- nsubj(X,Y).
rel(X,Y) :- nsubjpass(X,Y).
rel(X,Y) :- csubj(X,Y).
rel(X,Y) :- comp(X,Y).
rel(X,Y) :- obj(X,Y).
rel(X,Y) :- dobj(X,Y).
rel(X,Y) :- iobj(X,Y).
rel(X,Y) :- pobj(X,Y).
rel(X,Y) :- attr(X,Y).
rel(X,Y) :- ccomp(X,Y).
rel(X,Y) :- xcomp(X,Y).
rel(X,Y) :- compl(X,Y).
rel(X,Y) :- mark(X,Y).
rel(X,Y) :- acomp(X,Y).
rel(X,Y) :- agent1(X,Y).
rel(X,Y) :- ref1(X,Y).
rel(X,Y) :- expl(X,Y).
rel(X,Y) :- mod(X,Y).
rel(X,Y) :- advcl(X,Y).
rel(X,Y) :- purpcl(X,Y).
rel(X,Y) :- tmod(X,Y).
rel(X,Y) :- rcmod(X,Y).
rel(X,Y) :- amod(X,Y).
rel(X,Y) :- infmod(X,Y).
rel(X,Y) :- partmod(X,Y).
rel(X,Y) :- num(X,Y).
rel(X,Y) :- number(X,Y).
rel(X,Y) :- appos(X,Y).
rel(X,Y) :- nn(X,Y).
rel(X,Y) :- abbrev(X,Y).
rel(X,Y) :- advmod(X,Y).
rel(X,Y) :- neg(X,Y).
rel(X,Y) :- poss(X,Y).
rel(X,Y) :- possesive(X,Y).
rel(X,Y) :- prt(X,Y).
rel(X,Y) :- det(X,Y).
rel(X,Y) :- prep(X,Y).
rel(X,Y) :- sdep(X,Y).
rel(X,Y) :- xsubj(X,Y).

related(X,Z) :- rel(X,Y), rel(Y,Z).

но в последнем отношении я хочу, чтобы первый "rel" отличался от следующего "rel" как проверить, различны ли они .. пожалуйста, помогите

Ответы [ 4 ]

3 голосов
/ 03 ноября 2010

Они являются предикатами, поэтому они либо сохраняются, либо нет.В Прологе вы не различаете их вхождения.Таким образом, «разные» могут применяться только к их аргументам, чего легко достичь, добавив, что они должны быть… ну .. разными:

rel(X,Y), rel(Y,Z), rel(X,Y) \= rel(Y,Z)

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

Редактировать: Я просто прочитал комментарии, которые вы хотите, чтобы фактическое отношение отличалось.Затем вы должны как-то перенести это отношение вверх.Вот предложение:

Замените rel/2 на rel/3 следующим образом: rel(X,Y, Type) :- Type = dep, dep(X,Y). Тогда вы можете обеспечить отличающиеся отношения с rel(X,Y,Type1), rel(X,Y,Type2), Type1 \= Type2.

2 голосов
/ 05 ноября 2010

@ Нир: Как общее замечание, вместо R1 =..[X,A,B], call(R1) это часто предпочтительнее написать call(X,A,B).

2 голосов
/ 03 ноября 2010

У вас есть как минимум два пути.Если вам разрешено изменять предикаты rel / 2, возможно, вы захотите добавить новый аргумент, чтобы вернуть также соответствующее отношение.Вместо

rel(X,Y):- dep(X,Y).
rel(X,Y):- aux(X,Y).

укажите что-то вроде

rel(X,Y, dep):- dep(X,Y).
rel(X,Y, aux):- aux(X,Y).

, а затем в связанных / 2 используйте что-то вроде этого:

related(X,Z):- rel(X,Y, R1), rel(Y, Z, R2), R1 \= R2.

Если вам не разрешено изменятьпредикат rel / 2, тогда вы можете сделать это с помощью некоторых других трюков, изменив related / 2 на что-то вроде:

related(X, Z):-
    clause(rel(X,Y), A), 
    clause(rel(Y,Z), B), 
    call(A), call(B), 
    functor(A,Fa,_), functor(B, Fb, _), 
    Fa \= Fb.
0 голосов
/ 03 ноября 2010

Я все еще новичок в прологе, но подумал, что это хорошая проблема.Мое решение имеет некоторые сходства с ответом выше, вы можете использовать что-то вроде этого:

related(A,C,List):- member(X,List),
               member(Y,List),
               not(X=Y),
               R1=..[X,A,B],
               R2=..[Y,B,C],
               call(R1),
               call(R2).

Затем вы бы назвали его с помощью isRelated(X,Y):-related(X,Y,[prt,det,.......])

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