1

関数を表すには

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]]

evaluate( DT, X, Y )Y が値 X で決定木 DT を評価することによって得られる値である場合に成立する述語の 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 ? ;
4

1 に答える 1

8

あなたの中間表現は少し直感に反していると思います。[TrueValue, Condition, ElseValue]リストは次のような 3 タプルとして理解されることを意図していると言っても過言ではありTrueValueませFalseValueん。これが正しい理解であると仮定して答えます。

ここにあるのは、基本的な抽象構文木 (AST) です。値または 3 タプルの 2 つのパターンがあります。値の評価は簡単です。

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.
于 2013-02-23T03:11:35.263 に答える