簡體   English   中英

根據上下文不同的解釋順序?

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

“var”案例

可能的問題:我想你想要這里的第二個子句,它總是作為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM