我有一個使用約束條件在Sicstus Prolog中編寫的程序。 我的目標是使用標籤/ 2和其他方法來獲得我的變量的隨機實例化。序言:隨機標記
例子:
X #> 2, Y #= 2*X, Z #<10
如果我使用
List = [X,Y,Z],
labeling([], List)
獲得將是第一個結果X = Y = Z = 0。你怎麼認爲是返回一組隨機的最佳方式的X,Y和Z值?
我有一個使用約束條件在Sicstus Prolog中編寫的程序。 我的目標是使用標籤/ 2和其他方法來獲得我的變量的隨機實例化。序言:隨機標記
例子:
X #> 2, Y #= 2*X, Z #<10
如果我使用
List = [X,Y,Z],
labeling([], List)
獲得將是第一個結果X = Y = Z = 0。你怎麼認爲是返回一組隨機的最佳方式的X,Y和Z值?
對於最近的SICStus版本中的標籤選項我不太瞭解,但對於SWI-Prolog的庫(clpfd),有選項random_variable(Seed)和random_value(Seed),您可以將它們用於標籤([random_variable(10),random_value(10)],List)。也許你可以讓SICStus的作者整合類似的選項?
可以使用 all_different([X,Y,Z])的順序,以獲得不同的值 然而在Sicstus隨機種子工作可能會非常棘手,你可能需要定義一個函數來改變種子或開始再次的隨機函數。 檢查以下 www.sics.se/sicstus/docs/3.7.1/html/sicstus_23.html
在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).
見值(枚舉)。
希望它幫助;)
爲了使它乾淨,你需要明確提及種子! – false 2016-12-18 18:53:18
https://sicstus.sics.se/sicstus/docs/4.0.4/html/sicstus/Enumeration-Predicates.html – 2016-12-18 19:03:39
我似乎不能夠使用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
我真的很無助,我不能在SICStus中使用這些選項,因爲我不得不使用它來代替SWI 。 – ecc 2012-01-02 14:53:28