[英]Different order of interpretation depending on the context?
我有以下規則來轉換結構。
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].
我怎樣才能做到這一點?
問題字段是: named(N) <=> Subj
我需要不同順序的原因是 case1(fact) 我已經分配了值,在 case2(question) 我需要將變量unbound ,以便以后可以綁定它。
PS>如果有任何區別,規則調用將被刪除兩個步驟,即通過另外兩個規則。
這里是確切的用法。 差異是一個做 skolemization 另一個不做。 問題變量必須保持不統一/自由,因此它們可以用作查詢。
除了命名(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(_,Verb,named(N)),[named(N,NewVar),S2]) :- next_uid(NewVar), cmap(predicate(_,Verb,?X?),S2).
您想通過顯式驗證predicate/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_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].
可能的問題:我想你不想要這里的第二個子句,它總是作為Subj
未綁定的第二種情況執行,因為Subj
可以與named(N)
統一。
cmap_var(predicate(_,Verb,Subj),S) :-
S =.. [Verb,Subj].
cmap_var(predicate(_,Verb,named(N)),[named(N,NewVar),S]) :-
next_uid(NewVar),
S =.. [Verb,NewVar].
“標記”意味着將一個術語包含在另一個術語中,以便能夠更慣用地編寫 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].
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.