28

最初に指定された座標 [y, x] が 2 番目に指定された座標 (左上隅に [0, 0] があるボードを想像してください) に下降していることを宣言する述語、descendo を書きたいと思います。

Prolog での非常に単純な実装は次のようになります。

descending(B, A) :-
  B = [B1,B2],
  A = [A1,A2],
  B1 is A1 + 1,
  B2 is A2 + 1.

ただし、これを core.logic に実装できません。私はすでにさまざまなことを試しました (==/=fd/conso/appendo と +fd/+)。私が試したことの1つ:

(defn descendo
  [b a]
  (l/fresh [b1 b2 a1 a2]
           (l/== b [b1 b2])
           (l/== a [a1 a2])
           (l/+fd b1 1 a1)
           (l/+fd b2 1 a2)))

それらのほとんどは、次のように実行すると何も返されません。

(l/run* [q]
  (l/fresh [a]
    (l/infd a (l/domain [0 0] [1 0] [0 1] [1 1]))
    (descendo a [0 0])
    (l/== q a)))

=> () ; expected output: ([1 1])

core.logic を使う上で、Prolog を考えすぎるとイマイチな気がします…何かヒントがあればよろしくお願いします。前もって感謝します。

EDIT: descendoが同じままである回避策を見つけましたが、それを実行するときはドメインを使用しません:

(l/run* [q]
  (l/fresh [a]
    (l/membero a [[0 0] [1 0] [0 1] [1 1]])
    (l/membero q [[0 0] [1 0] [0 1] [1 1]])
    (descendo a q)))

=> ([1 1])

とにかくベクトルで使用することを意図しているかどうかdomainはわかりません。したがって、これは回避策ではなく、実際の解決策である可能性があります。

4

1 に答える 1

0

回避策を見つけました。descendo は同じままですが、実行するときはドメインを使用しません。

(l/run* [q]
  (l/fresh [a]
    (l/membero a [[0 0] [1 0] [0 1] [1 1]])
    (l/membero q [[0 0] [1 0] [0 1] [1 1]])
    (descendo a q)))

=> ([1 1])

とにかくドメインがベクターで使用されることを意図しているかどうかわからないため、これは回避策ではなく、実際の解決策である可能性があります。

于 2013-03-29T17:27:31.457 に答える