【问题标题】:Decision tree evaluation using Prolog使用 Prolog 进行决策树评估
【发布时间】:2015-07-09 01:56:17
【问题描述】:

表示函数

f(x) =
    if x < -2 then -1
    else
        if x > 2 then +1
        else
            0

决策树表示为

[-1, [lt, -2], [1, [gt, 2], 0] ]

同理,表示函数

f(x) =
    if x < 0 then
       if x < -3 then -1
       else 0
    else
       if x < 3 then +1
       else +2

我们使用树:

[-1,[lt,-3],0],[lt,0],[1,[lt,3],2]]

如果 Y 是通过对值 X 评估决策树 DT 获得的值,我如何为 evaluate( DT, X, Y ) 谓词编写 Prolog 代码?

示例输入输出如下:

?- evaluate([-1,[lt,-2],[1,[gt,2],0]],1,X).
X = 0 ? ;

?- evaluate([[-1,[lt,-3],0],[lt,0],[1,[lt,3],2]],7,X).
X = 2 ? ;

【问题讨论】:

  • 你问它是什么意思是家庭作业...我试图解决 Prolog 问题以便我可以学习它..我能够很好地解决简单的问题..但发现困难艰难的,,,自学有其局限性.. :)
  • 如果问题是家庭作业,我们会尝试给出提示而不是完整的解决方案。这样,当你的教授搜索他们分配给你的问题并在这里找到你的问题时,你就不会因为作弊/抄袭而被学校开除,因为你必须自己做一些工作。
  • 有人花时间试图回答你的问题。无故删除他们的作品是不礼貌的。请考虑他们的回答,如果正确,请接受。

标签: prolog


【解决方案1】:

我发现您的中间表示有点违反直觉。公平地说,这些列表应该被理解为一个三元组,例如:[TrueValue, Condition, ElseValue],其中TrueValueFalseValue 可以是值或其他条件三元组?假设这是正确的理解,我会回答。

这里有一个基本的抽象语法树 (AST)。我们将有两种模式:一个值或一个 3 元组。评估一个值很容易:

evaluate(Value, _, Value) :- number(Value).

有了这个,评估条件就很容易了:

evaluate([TrueCase, Condition, FalseCase], X, Result) :-
  evaluate_condition(Condition, X) 
      -> evaluate(TrueCase, X, Result)
       ; evaluate(FalseCase, X, Result).

我已将条件检查本身移至单独的谓词。这样可以方便地添加新的运算符。现在我们只需要对其进行编码:

evaluate_condition([lt, Y], X) :- X < Y.
evaluate_condition([gt, Y], X) :- X > Y.

这甚至比您希望的要好一些,因为它不会产生虚假的选择点:

?- evaluate([-1,[lt,-2],[1,[gt,2],0]],1,X).
X = 0.

?- evaluate([[-1,[lt,-3],0],[lt,0],[1,[lt,3],2]],7,X).
X = 2.

【讨论】:

    猜你喜欢
    • 2016-12-29
    • 2020-12-30
    • 2019-09-22
    • 2018-08-26
    • 2020-03-05
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多