如何解决根据上下文不同的解释顺序?
我有以下转换结构的规则。
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。