2011-02-01 73 views
1

我該怎麼定義一個選擇/ 2給予無限的答案選擇/ 2多個答案SWI序言

choose(List, Elt) :- 
    length(List, Length), 
    random(0, Length, Rand), 
    nth1(Rand, List, Elt). 

我的選擇/ 2只給出一個答案

例子:

?- choose([1,2,3],Elt). 
Elt = 1; 
Elt = 1; 
Elt = 3; 
... 

回答

2

簡單:追加作爲第二條款

choose(List, E) :- choose(List, E). 

到您的程序。順便說一句,你似乎想要nth0/3而不是nth1/3。例如,「list_choice/2」是一個更好,更具說明性的名稱,而不是「choose/2」。

2

嘗試使用重複:

choose(L, O) :- repeat, member(O, L).

它將通過列表的所有成員原路返回,然後重複將導致其再次嘗試所有的成員。

?- choose([1,2,3],Out). Out = 1 ; Out = 2 ; Out = 3 ; Out = 1 ; Out = 2 ; Out = 3 ;