根据上下文不同的解释顺序?

问题描述

我有以下转换结构的规则。

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

问题是一个规则需要子句按一个顺序,还有另一个规则需要子句按另一个顺序,如下:

cmap(predicate(_,Subj].
cmap(predicate(_,S2]) :- 
   next_uid(NewVar),NewVar].

我该怎么做?

问题字段是:​​named(N) Subj

我需要不同顺序的原因是 case1(fact) 我已经分配了值,在 case2(question) 我需要变量未绑定,以便以后可以绑定它。

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


这里是确切的用法。差异是一个做 skolemization 另一个不。 问题变量必须保持不统一/自由,以便它们可以用作查询

除了named(X),当它在结构/thats DRS奇怪的结构中时,必须提取作为它自己单独的事实/。

% 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(_,[named(N,NewVar),S2]) :- next_uid(NewVar),cmap(predicate(_,?X?),S2).

解决方法

您想通过显式验证 predicate/3 的第三个参数是否绑定(“是一个变量”,以执行标准语言滥用)来区分情况。这完全不符合一阶正逻辑:

cmap(predicate(_,Verb,NN),[S1,S2]) :-
   nonvar(NN),!,cmap_nonvar(predicate(_,S2]).

对称(实际上可以去掉var(NN),!,因为测试和对子句的后续承诺已经发生,但如果不昂贵,我喜欢对称:

cmap(predicate(_,S2]) :-
   var(NN),cmap_var(predicate(_,S2]).

修改:这里我们可以去掉“univ”的一种用法,=../2(如果不需要就不要使用“univ”)。此外,奇怪和不平衡的是,第二个参数在一种情况下是一个列表,而在另一种情况下是一个非列表。为什么不在这两种情况下都使用列表?

“非变量”案例

可能的问题:对于 cmap_nonvar,如果 predicate/3 的第三个参数不与 named(N) 统一,则第二个子句也将执行 > 好像它与 named(N) 统一。真的要这样吗?

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

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


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

“var”案例

可能的问题:我想您想要这里的第二个子句,它总是作为第二种情况执行,Subj 未绑定为 {{1 }} 可以与 Subj 统一。

named(N)

技巧:标记参数

“标记”意味着将一个术语包含在另一个术语中,以便能够更地道地编写 Prolog 代码。

在这种情况下,可以标记cmap_var(predicate(_,S) :- S =.. [Verb,Subj]. cmap_var(predicate(_,NewVar].

NN

tag(X,var(X)) :- var(X),!. tag(X,nonvar(X)) :- nonvar(X),!. cmap(predicate(_,S2]) :- tag(NN,TaggedNN),cmap_tag_aware(predicate(_,S2]). 然后可以匹配传递的术语的特定形式:

cmap