ここでやろうとしているのは、かなり古典的な論理プログラミングです。私がSchemeに常に使用しているアプローチは、amb
演算子のバリエーションです。
amb
このように動作します:
(let ((x (amb 1 2 3 4))
(y (amb 5 6 7 8))
(rule (= 10 (+ x y))
(list x y))
これにより、合計が10になるようにいくつかが返されx y
ます。これと他の魔術を使用して、システムを作成できます。
まず、パターンが私たちの「ルール」になります。したがって、パターンを次のようにフォーマットするとします。
'((list-of-vars) (rule 1) (rule 2) (rule 3))
ここで、入力データについて、次のように構成されているとしましょう。
'((list-of-values) (fact 1) (fact 2) (fact 3))
今、私たちの生活はとても簡単になりました。私たちは、スキームのマクロ/手順/魔術に次のようなことをさせたいだけです。
(define-syntax resolve
(syntax-rules ()
[(_ ((v1 vs ...)
r1 rs ...)
((ps ...)
f1 fs ...))
(let* ((v1 (amb ps ...))
(vs (amb ps ...))
...
(sym-table (list (cons (quote v1) v1)
(cons (quote vs) vs)
...))
(facts '(f1 fs ...))
(rules '(r1 rs ...)))
(map rule (map
(lambda (rule)
(member (substitute rule sym-table)
facts))
rules))
sym-table)]))
要旨の完全なコード
うまくいけば、これがあなたに出発点を与えるでしょう、あなたがどんな質問をするか私に知らせてください。