代码之家  ›  专栏  ›  技术社区  ›  dacuna

Prolog,条件式

  •  1
  • dacuna  · 技术社区  · 14 年前

    我和prolog(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.
    

    即facta有50%的发生概率,factb有30%,最后20%的非事实发生。另外,我还有其他谓词,其中更改factb而不是facta,也更改x间隔。

    现在我有函子:

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

    这个谓词告诉prob中x和y的n是什么。这个谓词处理大小写:

    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 回复  |  直到 7 年前
        1
  •  1
  •   Amadan    14 年前

    看我上面的评论:如果 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).
    

    免责声明:我从来没有使用GPROLG,你可能需要调整细节到你的方言。