prolog中的关系处理

prolog中的关系处理,prolog,Prolog,但在最后一个关系中,我希望第一个rel与下一个rel不同 如何检查它们是否不同。。请帮助它们是谓词,因此它们要么有效,要么无效。在序言中,你不能区分它们的不同出现。因此,不同的观点只能适用于他们的论点,这很容易通过补充他们应该。。好不同的: relX,Y,relY,Z,relX,Y\=relY,Z 请记住,对于not equal,有不同的运算符可用。你必须给出一个更清晰的定义来决定你想要的是什么 编辑: 我刚读到你希望实际关系有所不同的评论。然后你应该以某种方式将这种关系向上传递。这里有一个建议

但在最后一个关系中,我希望第一个rel与下一个rel不同
如何检查它们是否不同。。请帮助

它们是谓词,因此它们要么有效,要么无效。在序言中,你不能区分它们的不同出现。因此,不同的观点只能适用于他们的论点,这很容易通过补充他们应该。。好不同的:

relX,Y,relY,Z,relX,Y\=relY,Z

请记住,对于not equal,有不同的运算符可用。你必须给出一个更清晰的定义来决定你想要的是什么

编辑: 我刚读到你希望实际关系有所不同的评论。然后你应该以某种方式将这种关系向上传递。这里有一个建议:

用rel/3替换rel/2,如下所示:relX,Y,Type:-Type=dep,depX,Y。
然后,您可以确保与relX、Y、Type1、relX、Y、Type2、Type1\=Type2的关系不同。

它们是谓词,因此它们要么有效,要么无效。在序言中,你不能区分它们的不同出现。因此,不同的观点只能适用于他们的论点,这很容易通过补充他们应该。。好不同的:

relX,Y,relY,Z,relX,Y\=relY,Z

请记住,对于not equal,有不同的运算符可用。你必须给出一个更清晰的定义来决定你想要的是什么

编辑: 我刚读到你希望实际关系有所不同的评论。然后你应该以某种方式将这种关系向上传递。这里有一个建议:

用rel/3替换rel/2,如下所示:relX,Y,Type:-Type=dep,depX,Y。
然后您可以确保与relX、Y、Type1、relX、Y、Type2、Type1\=Type2的不同关系。

您至少有两种方法。 如果允许您更改rel/2谓词,您可能需要添加一个新参数来返回所涉及的关系。 而不是

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(X,Y):- dep(X,Y).
rel(X,Y):- aux(X,Y).
然后在相关/2中使用如下内容:

rel(X,Y, dep):- dep(X,Y).
rel(X,Y, aux):- aux(X,Y).
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.
如果不允许更改rel/2谓词,则可以使用其他一些技巧,将related/2更改为:

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

你至少有两种方法。 如果允许您更改rel/2谓词,您可能需要添加一个新参数来返回所涉及的关系。 而不是

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(X,Y):- dep(X,Y).
rel(X,Y):- aux(X,Y).
然后在相关/2中使用如下内容:

rel(X,Y, dep):- dep(X,Y).
rel(X,Y, aux):- aux(X,Y).
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.
如果不允许更改rel/2谓词,则可以使用其他一些技巧,将related/2更改为:

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

我还是一个prolog新手,但我认为这是一个很好的问题。我的解决方案与上面的答案有一些相似之处,您可以使用如下内容:

rel(X,Y, dep):- dep(X,Y).
rel(X,Y, aux):- aux(X,Y).
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.

然后你可以用isRelatedX,Y来称呼它:-relatedX,Y,[prt,det,…]

我还是一个初学者,但我认为这是一个很好的问题。我的解决方案与上面的答案有一些相似之处,您可以使用如下内容:

rel(X,Y, dep):- dep(X,Y).
rel(X,Y, aux):- aux(X,Y).
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.

然后你可以用isRelatedX,Y来称呼它:-relatedX,Y,[prt,det,…]

@Nir:一般来说,不是R1=…[X,a,B],而是R1
最好写callX,A,B.

@Nir:一般来说,callR1不是R1=…[X,A,B],而是
最好编写callX、A、B。

您希望指示的变量不同,或者关系本身不同?关系本身应该不同。。不可变您希望指示的变量不同或关系本身不同?关系本身应该不同。。非变量