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