2012-09-10 17 views
29

我想寫一個謂詞descendo,它聲明第一個給定座標[y,x]正在下降到第二個給定座標(想象使用[0 ,0]在左上角)。謂詞聲明使用有限域的降序/升序座標

在序言

一個非常簡單的實現看起來是這樣的:

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

我無法在core.logic雖然來實現這一點。我已經嘗試了很多不同的東西(==/= fd/conso/appendo和+ fd/+)。有一個問題我試過的東西:

(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]) 

我有一種感覺,在序言想太多使用的核心時,是不好的。邏輯...任何暗示讚賞。提前致謝。

編輯:找到一個解決辦法,其中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,就是要在使用無論如何,所以這可能不是一個解決方法,但實際的解決方案。

+1

FD在core.logic中僅用於自然數字,不適用於矢量等 – Ankur

+7

請將您的解決方案作爲解決方案發布:-) – ordnungswidrig

回答

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]) 

我不知道域是否意味着要對向量無論如何使用,所以這可能不是解決方法,而是實際的解決方案。