您在这里尝试做的是相当经典的逻辑编程。我一直用于 Scheme 的方法是amb
运算符的一些变体。
amb
像这样工作:
(let ((x (amb 1 2 3 4))
(y (amb 5 6 7 8))
(rule (= 10 (+ x y))
(list x y))
这将返回一些x y
,因此它们的总和为 10。现在使用这个和其他一些巫术,我们可以制作你的系统。
首先,模式将成为我们的“规则”。所以假设我们像这样格式化我们的模式:
'((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)]))
要点中的完整代码
希望这能给你一个起点,让我知道你有什么问题。