2012-01-01 15 views
9

que tiene un programa escrito en Prolog SICStus mediante restricciones. Mi objetivo es usar etiquetado/2 y algún otro método para obtener una instanciación aleatoria de mis variables.Prolog: Random Etiquetado

Ejemplo:

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

Si uso

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

El primer resultado obtenido será X = Y = Z = 0. ¿Cómo cree que es la mejor manera de devolver un conjunto aleatorio de valores para X, Y y Z?

Respuesta

6

No sé mucho sobre las opciones de etiquetado en las versiones recientes de SICStus, pero con la biblioteca (clpfd) de SWI-Prolog, existen las opciones random_variable (Seed) y random_value (Seed), puede usarlas por ejemplo con etiquetado ([random_variable (10), random_value (10)], List). ¿Tal vez puede hacer que los autores de SICStus integren opciones similares?

+1

que no parecen ser capaces de utilizar random_variable y random_value como opciones para el etiquetado, a pesar de que estoy usando que library.'! Error de dominio en el argumento 1 del usuario: etiquetado/2 ! esperado etiquetado_opciones, pero se encontró random_variable (10) ! objetivo: el etiquetado (usuario: [random_variable (10), random_value (10)], [_ 134]) ' – ecc

+0

Es realmente un fastidio que no puedo usar esas opciones con SICStus, ya que estoy obligado a usar esto en vez de SWI . – ecc

0

puede utilizar all_different ([X, Y, Z]) con el fin de obtener diferentes valores sin embargo, trabajar con semilla aleatoria en SICStus podría ser difícil y puede que tenga que definir una función para cambiar la semilla o arranque la función aleatoria de nuevo. de verificación a continuación www.sics.se/sicstus/docs/3.7.1/html/sicstus_23.html

2

En SICStus, esto se hace con una selección personalizada de variables/valores.

En su caso, simplemente:

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

Ver valor (Enum) en https://sicstus.sics.se/sicstus/docs/4.0.4/html/sicstus/Enumeration-Predicates.html.

creo que sirve;)

+1

Para hacerlo limpio, ¡debe mencionar una semilla explícitamente! – false

+0

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