Prolog 不同的解释顺序取决于上下文?

Prolog 不同的解释顺序取决于上下文?,prolog,order-of-execution,Prolog,Order Of Execution,我有以下规则来转换结构 cmap(predicate(_,Verb,named(N)),[S1,S2]) :- next_uid(NewVar), S1 =.. [named,N,NewVar], S2 =.. [Verb,NewVar]. cmap(predicate(_,Verb,Subj),S) :- S =.. [Verb,Subj]. 问题在于,一条规则需要子句处于一个顺序,而另一条规则需要子句处于另一个顺序,如下所示: cmap(predicate(_

我有以下规则来转换结构

cmap(predicate(_,Verb,named(N)),[S1,S2]) :-
   next_uid(NewVar), 
   S1 =.. [named,N,NewVar], 
   S2 =.. [Verb,NewVar].
cmap(predicate(_,Verb,Subj),S) :- 
   S =.. [Verb,Subj].
问题在于,一条规则需要子句处于一个顺序,而另一条规则需要子句处于另一个顺序,如下所示:

cmap(predicate(_,Verb,Subj),S) :- 
   S =.. [Verb,Subj].
cmap(predicate(_,Verb,named(N)),[S1,S2]) :- 
   next_uid(NewVar), 
   S1 =.. [named,N,NewVar], 
   S2 =.. [Verb,NewVar].
我该怎么做

问题字段为:命名(N)sub

我需要不同顺序的原因是case1(事实)我已经赋值了,case2(问题)我需要变量被解除绑定,以便以后可以绑定它

PS>如果有任何不同,则规则调用将被删除两个步骤,即通过另外两个规则


这里是确切的用法。区别在于,一个不进行简化,另一个不进行简化。 问题变量必须保持不统一/自由,因此它们可以用作查询

此外,命名为(X),当它位于结构/that DRS weirdnes i无法控制/中时,必须提取为它自己的独立事实

% provides/unifies ID for every Reference variable
skolem([]).
skolem([H|T]) :- next_uid(H), skolem(T). 

convert([],[]).
% use the map to convert any Item
convert(Item-_,R) :- cmap(Item,R).
%processing Questions
convert(drs([], [question(drs(_Refs,Conds))]), Res) :- convert(Conds, Res).
%DRS processing
convert(drs(Refs,Conds),Res) :- skolem(Refs), convert(Conds,Res).
% process list of items                     
convert([H|T],[RH|RT]) :- convert(H,RH), convert(T,RT).

可能是以下几点:

cmap(predicate(_,Verb,named(N)),[named(N,NewVar),S2]) :- next_uid(NewVar),  cmap(predicate(_,Verb,?X?),S2).

您希望通过显式验证
谓词/3
的第三个参数是否绑定(“是变量”,以执行标准语言滥用)来区分这些情况。这完全超出了一阶正逻辑:

cmap(predicate(_,Verb,NN),[S1,S2]) :-
   nonvar(NN),
   !,
   cmap_nonvar(predicate(_,Verb,NN),[S1,S2]).
对称性(实际上可以去掉
var(NN),!
因为测试和随后对该子句的委托已经发生了,但是如果对称性不昂贵,我喜欢对称性:

cmap(predicate(_,Verb,NN),[S1,S2]) :-
   var(NN),
   !,
   cmap_var(predicate(_,Verb,NN),[S1,S2]).
修改:在这里我们可以去掉“univ”的一种用法,
=../2
(如果不需要,就不要使用“univ”)。另外,第二个参数在一种情况下是列表,在另一种情况下是非列表,这很奇怪,也很不平衡。为什么不在这两种情况下都使用列表呢

“非机动车”案件 可能的问题:对于
cmap\u nonvar
,如果
predicate/3
的第三个参数没有与
named(N)
统一,就像它与
named(N)
统一一样,则执行第二个子句。真的需要这样做吗

% if the 3rd argument of predicate/3 unifies with named(N)

cmap_nonvar(predicate(_,Verb,named(N)),[named(N,NewVar),S]) :-
   next_uid(NewVar), 
   S =.. [Verb,NewVar].


cmap_nonvar(predicate(_,Verb,Subj),[S]) :- 
   S =.. [Verb,Subj].
“var”案例 可能的问题:我想您不希望第二个子句出现在这里,它总是作为第二种情况与
sub
一起执行,因为
sub
可以与
命名(N)
统一

技巧:标记论点 “标记”意味着将一个术语封装到另一个术语中,以便能够更习惯地编写Prolog代码

在这种情况下,可以标记
NN

tag(X,var(X)) :- var(X),!.
tag(X,nonvar(X)) :- nonvar(X),!.

cmap(predicate(_,Verb,NN),[S1,S2]) :-
  tag(NN,TaggedNN),
  cmap_tag_aware(predicate(_,Verb,TaggedNN),[S1,S2]).
cmap
然后可以匹配所传递术语的特定形式:

cmap_tag_aware(predicate(_,Verb,nonvar(named(N))),[named(N,NewVar),S]) :-
   next_uid(NewVar), 
   S =.. [Verb,NewVar].

cmap_tag_aware(predicate(_,Verb,nonvar(Subj)),[S]) :- 
   S =.. [Verb,Subj].

cmap_tag_aware(predicate(_,Verb,var(Subj)),S) :- 
   S =.. [Verb,Subj].

cmap_tag_aware(predicate(_,Verb,var(named(N))),[named(N,NewVar),S]) :-
   next_uid(NewVar), 
   S =.. [Verb,NewVar].

嗯..我明白了..那会有很多代码..我必须为及物动词和双及物动词复制相同的东西..哎哟..似乎可以很容易地将named()作为特例进行预处理并以某种方式提前删除..@sten我添加了一个关于标记的注释。可能会有帮助吗?
cmap_tag_aware(predicate(_,Verb,nonvar(named(N))),[named(N,NewVar),S]) :-
   next_uid(NewVar), 
   S =.. [Verb,NewVar].

cmap_tag_aware(predicate(_,Verb,nonvar(Subj)),[S]) :- 
   S =.. [Verb,Subj].

cmap_tag_aware(predicate(_,Verb,var(Subj)),S) :- 
   S =.. [Verb,Subj].

cmap_tag_aware(predicate(_,Verb,var(named(N))),[named(N,NewVar),S]) :-
   next_uid(NewVar), 
   S =.. [Verb,NewVar].