2011-08-01 153 views
4

我使用SWI-Prolog的和感到困惑,爲什麼選擇庫將被寫入到提供以下輸出:SWI-Prolog的選項處理

?- option(a(A), [a=1, a=2, a(3)]). 
A = 3. 
?- option(b(B), [b=1, b=2]). 
B = 1. 

我希望A = 1 ......通過選項展望庫代碼雖然,這個結果顯然是打​​算(git link),但爲什麼這不是一個錯誤?

option(Opt, Options) :-     % make option processing stead-fast 
     arg(1, Opt, OptVal), 
     nonvar(OptVal), !, 
     functor(Opt, OptName, 1), 
     functor(Gen, OptName, 1), 
     option(Gen, Options), 
     Opt = Gen. 
option(Opt, Options) :- 
     get_option(Opt, Options), !. 


get_option(Opt, Options) :- 
     memberchk(Opt, Options), !. 
get_option(Opt, Options) :- 
     functor(Opt, OptName, 1), 
     arg(1, Opt, OptVal), 
     memberchk(OptName=OptVal, Options), !. 

回答

4

由於memberchk/2(其是半確定性的,即它成功最多一次)在你報價的代碼,非確定性被使用(A = 1; A = 2;等等),似乎明確地而不是意圖。如果有的話,矛盾的選擇應該可能引發域錯誤,不是嗎?

+0

我想我可以原諒圖書館找到列表中的第一個匹配,並忽略後續匹配(即推入一個新的選項到隱藏後面的一個選項列表),並半分析它。我只是無法找到一種方法來證明它首先在表單鍵(值)然後key = value中進行搜索。 – DaveEdelstein