2013-10-16 42 views
3

我需要編寫一些core.logic代碼來檢查三個目標中的兩個目標是否成功。clojure.core.logic編碼「三分之二」

我知道我可以寫這樣的:

(run* [a b c] 
     (conde [goal1 goal2] 
      [goal2 goal3] 
      [goal3 goal1])) 

...但是這很麻煩,而且我確實需要來概括我的代碼爲「N出M的」情況下,這將是很難一概而論。有人能指出我採用正確的方法來解決這類問題嗎?有沒有簡化這個功能的功能?

謝謝!

+0

在Prolog,這是可以做到的「2出N個「目標規則是這樣的:'two_of(GS): - 追加(XS,YS,GS),成員(X,XS),YS = [Y | _],X,Y.(這可能不是有效的標準Prolog ,但它可以在SWI-Prolog和GNU Prolog中使用。)但是我找不到方法o把它翻譯成core.logic,因爲它不允許像Prolog在這裏所做的那樣把變量當作目標。 (錯誤消息是'ClassCastException clojure.core.logic.LVar不能轉換爲clojure.lang.IFn'。)有誰知道一種方法來做到這一點? –

+0

感謝Rord對這些見解......很高興知道我的問題至少有點不重要。 (或壞,取決於你如何看待它。) – drcode

回答

1

可能是一個宏可以幫助:

(defmacro n-of-m-goals [n all-goals] 
    `(conde [email protected](combinations all-goals n)) 

然後你的榜樣將成爲:

(run* [a b c] 
     (n-of-m-goals 2 [goal1 goal2 goal3])) 

組合爲math.combinatorics

+0

哇,非常優雅的解決方案 - 感謝分享! – drcode