пролог, условно-подобная форма - PullRequest
1 голос
/ 28 июня 2010

Ну, мне трудно работать с прологом (gprolog).Моя проблема заключается в следующем: у меня следующий предикат:

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.

, то есть факт A имеет 50% вероятности возникновения, факт B 30% и, наконец, 20% не фактов происходят.Также у меня есть другие предикаты, где меняют факт B, но не факт A, также меняются интервалы X.

Теперь у меня есть функтор:

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

, этот предикат говорит, что N для X иY в проб.Этот предикат обрабатывает случай:

result(factA,factB,N).

, но теперь мне нужно обработать:

result(factB,factA,N).

, и он вернет верный результат, понимаете? Я сделал что-то вроде этого:

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

но это не помогает "нет" результата.

У кого-нибудь есть идеи?

Спасибо!

1 Ответ

1 голос
/ 28 июня 2010

Глядя на мой комментарий выше: если first равно 50% (и с некоторой оптимизацией, если вы «знаете», случайное значение будет между 1 и 100):

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

Полагаю, это не то, что вы имели в виду, поскольку это не зависит от фактов, поэтому они не нужны в качестве аргументов.

Таким образом, если предположить, что factA - это 50%, это немного сложнее, но в основном та же идея, что и у вас:

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

Отказ от ответственности: я никогда не работал с gprolog, вам может потребоваться настроить детали в соответствии с вашим диалектом.

...