你在這裏試圖做的是相當經典的logic programming。我一直用於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)]))
full code in a gist
希望這給你一個出發點,讓我知道你有什麼問題。
你有一個你想要完成的實際例子嗎?目前有點模糊 – jozefg 2013-03-18 17:44:05
當然,對不起。我想定義一個函數,它會在我會給它的模式之後進行搜索。假設我有'搜索'和'((Mike喜歡橄欖球)'(Rachel喜歡網球)'((x喜歡y)(y是一項艱苦的運動)(x很豐富))(橄欖球是一項艱難的運動) (網球很容易) (麥克富有)(雷切爾很豐富))作爲'數據'。我想使(模式匹配搜索數據)返回Mike(在這種情況下) – Georgianaevil 2013-03-18 17:47:56
您將不得不提供一些標識確切變量的東西。否則,不清楚說「橄欖球」不是一個變量。 (對我們來說肯定,但更少的方案) – jozefg 2013-03-18 17:50:48