2012-01-01 11 views
9

Mam program napisany w Sicstus Prolog za pomocą wiązań. Moim celem jest użycie etykietowania/2 i innej metody w celu uzyskania losowej instancji moich zmiennych.Prolog: Losowe etykietowanie

Przykład:

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

Jeśli używam

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

Pierwszy wynik uzyskany będzie X = Y = Z = 0. Jak myślisz, co jest najlepszym sposobem, aby powrócić losowy zestaw wartości dla X, Y i Z?

Odpowiedz

6

Nie wiem zbyt wiele o opcjach etykietowania w ostatnich wersjach SICStus, ale z biblioteką (clpfd) SWI-Prolog, istnieją opcje random_variable (Seed) i random_value (Seed), można ich używać na przykład z etykietowanie ([losowa_zmienna (10), losowa_wartość (10)], Lista). Może uda Ci się przekonać autorów SICStus do zintegrowania podobnych opcji?

+1

I nie wydają się być w stanie wykorzystać random_variable i random_value jako opcje dla etykietowania, mimo że używam tego library.'! Błąd domeny w argumencie 1 użytkownika: etykieta/2 ! Oczekiwano opcji labeling_options, ale znalazłem random_variable (10) ! cel: etykietowanie (użytkownik: [losowa_zmienna (10), losowa_wartość (10)], [_ 134]) ' – ecc

+0

To naprawdę bummer, nie mogę używać tych opcji z SICStus, ponieważ jestem zmuszony użyć tego zamiast SWI . – ecc

0

można użyć all_different ([X, Y, Z]) w celu uzyskania różnych wartości jednak pracy z losowego nasion w Sicstus może być trudne i może trzeba zdefiniować funkcję, aby zmienić ziarno lub rozpocząć funkcja losowa ponownie. check poniżej www.sics.se/sicstus/docs/3.7.1/html/sicstus_23.html

2

W sicstus, odbywa się to z wyborem niestandardowych zmiennych/wartości.

W twoim przypadku, po prostu zrobić:

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). 

widoczny wartość (Enum) w https://sicstus.sics.se/sicstus/docs/4.0.4/html/sicstus/Enumeration-Predicates.html.

Nadzieja pomaga;)

+1

Aby go wyczyścić, musisz wyraźnie wymienić ziarno! – false

+0

https://sicstus.sics.se/sicstus/docs/4.0.4/html/sicstus/Enumeration-Predicates.html –