7

これは宿題ではありません。解決策はすでにテキストに含まれています。私はちょうど解決策を理解できませんでした。

問題

(run* (q)
  (let [a (== true q)
        b (== false q)]
    b))

正解

(false)

私の信じた解決策

()

私の混乱

どうやら「a (== true q)」行は実行されません。なぜなら、b だけがゴールだからです。これは私を混乱させます。これまでのロジック プログラミングに対する私のメンタル モデルは次のとおりです。

  • q へのすべての可能な代入を考慮する
  • プログラム全体をなんとか通過したものを出力する

    したがって、「a (== true q)」は q = true を強制し、「b (== false q)」の行を満たすことができなくなります。

    ただし、明らかに「目標を計算するために必要なもの」のみが実行されます。どうしたの?core.logic / mini-kanren の正しいメンタル実行モデルとは?

ありがとう

(ちなみに、mini-karen + core.logic は互いに同意するので、私は明らかに間違っています。私が間違っていることを理解したいだけです。)

4

1 に答える 1

9

==目標を生成します。aしかし、あなたは走るという目標を通過しません。だから、実行はそれについて知りません。同等の状況は次のとおりです。

(defn call [f] (f))

(call
  (let [a #(println "a")
        b #(println "b")]
    b))

関数は作成されますが、aに渡されませんcall。したがって、実行されることはありません。

于 2012-05-31T09:49:44.333 に答える