处理prolog中的关系

时间:2010-11-03 17:39:36

标签: prolog

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 个答案:

答案 0 :(得分:3)

他们是谓词,所以无论是否持有。在Prolog中,您无法区分它们的不同出现。所以“不同”只能适用于他们的论点,这很容易通过添加它们应该是......好吧......不同:

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的不同关系。

答案 1 :(得分:2)

你至少有两种方式。 如果允许更改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谓词,那么你可以用其他一些技巧来做,将相关的/ 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.

答案 2 :(得分:2)

@Nir:作为一般性评论,经常是R1 =..[X,A,B], call(R1)而不是call(X,A,B) 最好写{{1}}。

答案 3 :(得分:0)

我仍然是一个新手,但认为这是一个很好的问题。我的解决方案与上面的答案有些相似,你可以使用这样的东西:

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,.......])

进行调用