2012-01-01 52 views
9

我有一個使用約束條件在Sicstus Prolog中編寫的程序。 我的目標是使用標籤/ 2和其他方法來獲得我的變量的隨機實例化。序言:隨機標記

例子:

X #> 2, Y #= 2*X, Z #<10 

如果我使用

List = [X,Y,Z], 
labeling([], List) 

獲得將是第一個結果X = Y = Z = 0。你怎麼認爲是返回一組隨機的最佳方式的X,Y和Z值?

回答

6

對於最近的SICStus版本中的標籤選項我不太瞭解,但對於SWI-Prolog的庫(clpfd),有選項random_variable(Seed)和random_value(Seed),您可以將它們用於標籤([random_variable(10),random_value(10)],List)。也許你可以讓SICStus的作者整合類似的選項?

+1

我似乎不能夠使用random_variable和random_value作爲標籤選項,即使我使用library.'!用戶參數1中的域錯誤:標籤/ 2 !預期的labels_options,但發現random_variable(10) !目標:標籤(user:[random_variable(10),random_value(10)],[_ 134])' – ecc 2012-01-01 23:22:24

+0

我真的很無助,我不能在SICStus中使用這些選項,因爲我不得不使用它來代替SWI 。 – ecc 2012-01-02 14:53:28

0

可以使用 all_different([X,Y,Z])的順序,以獲得不同的值 然而在Sicstus隨機種子工作可能會非常棘手,你可能需要定義一個函數來改變種子或開始再次的隨機函數。 檢查以下 www.sics.se/sicstus/docs/3.7.1/html/sicstus_23.html

2

在sicstus,這是通過變量/值的自定義選擇完成。

在你的情況,只是做:在https://sicstus.sics.se/sicstus/docs/4.0.4/html/sicstus/Enumeration-Predicates.html

labeling([value(mySelValores)], List) 

mySelValores(Var, _Rest, BB, BB1) :- 
    fd_set(Var, Set), 
    select_best_value(Set, Value), 
    ( 
     first_bound(BB, BB1), Var #= Value 
     ; 
     later_bound(BB, BB1), Var #\= Value 
    ). 

select_best_value(Set, BestValue):- 
    fdset_to_list(Set, Lista), 
    length(Lista, Len), 
    random(0, Len, RandomIndex), 
    nth0(RandomIndex, Lista, BestValue). 

見值(枚舉)。

希望它幫助;)

+1

爲了使它乾淨,你需要明確提及種子! – false 2016-12-18 18:53:18

+0

https://sicstus.sics.se/sicstus/docs/4.0.4/html/sicstus/Enumeration-Predicates.html – 2016-12-18 19:03:39