2010-06-28 18 views
0

Eh bien, j'ai du mal à travailler avec prolog (gprolog). Mon problème est le suivant, j'ai le prochain prédicat:prolog, une forme conditionnelle

prob(factA,factB,X,first):- X=<50. 
prob(factA,factB,X,second):- X>50,X=<80. 
prob(factA,factB,X,none):- X>80,X=<100. 

qui est Facta ont 50% de probabilité de se produire, factB 30%, et enfin 20% des non des faits se produire. Aussi j'ai d'autres prédicat où changer le factB mais pas factA, change aussi les intervalles X.

Maintenant, j'ai foncteur:

result(X,Y,N):- random(1,100,I), 
    prob(X,Y,I,N). 

ce prédicat dit ce qui est N pour X un Y en prob. Ce prédicat traiter le cas:

result(factA,factB,N). 

mais maintenant je dois gérer:

result(factB,factA,N). 

et il retournera un résultat valable, une idée ?, je l'ai fait quelque chose comme ceci:

result(X,Y,N):- Y = factA, 
    random(1,100,I), 
    prob(Y,X,I,N). 
      J is 100-I, 
    prob(Y,X,J,N). 

mais cela ne gère pas bien le résultat 'none'.

Quelqu'un a une idée?

Merci!

+0

Veuillez corriger le formatage, c'est difficile à lire comme ça. En particulier, indentez tout le code de 4 espaces: cela préservera les lignes de fin et le définira en monospace. – Amadan

+0

Vos probabilités sont-elles liées aux positions ou aux identités de fait? C'est à dire. Dans votre exemple de 'result (factB, factA, N)', lequel voulez-vous avoir 50%: 'factA' ou' factB'? Ou permettez-moi de reformuler cela: est 'result' va toujours retourner 50% pour' first', 30% pour 'second' et 20% pour' none', ou est-ce 50% pour 'factA' en position X ou Y, 30% pour 'factB' (en position X ou Y) et 20% pour' none'? Par votre dernier extrait, je dirais le dernier? – Amadan

+0

J'ai refait le formatage, mais je n'ai rien changé d'autre: on dirait que vous avez un. où vous devriez avoir un, dans la troisième dernière ligne de votre dernière clause: "prob (Y, X, I, N)." –

Répondre

1

regardant mon commentaire ci-dessus: si first est de 50% (et avec une certaine optimisation si vous « savez » valeur aléatoire sera comprise entre 1 et 100):

prob(X,first):- X=<50, !. 
prob(X,second):- X=<80, !. 
prob(X,none). 

Je suppose que ce n'est pas ce que vous vouliez dire puisque cela ne dépend pas du tout des faits, ils ne sont donc pas nécessaires en tant qu'arguments.

Ainsi, en supposant factA est de 50%, un peu plus complexe, mais fondamentalement la même idée que le vôtre:

fact_prob(factA, 50). 
fact_prob(factB, 30). 

random_fact(X, _, I, R) :- 
    fact_prob(X, XP), 
    I <= XP, !, 
    R = first. 
random_fact(X, Y, I, R) :- 
    fact_prob(X, XP), 
    fact_prob(Y, YYP), 
    XYP is XP + YP, 
    I <= XYP, !, 
    R = second. 
random_fact(_, _, _, none). 

Disclaimer: Je ne ai jamais travaillé avec gprolog, vous devrez peut-être ajuster les détails à votre dialecte.