2012-09-10 8 views
29

Ich möchte ein Prädikat, das Abcendo, schreiben, das erklärt, dass die erste gegebene Koordinate [y, x] auf die zweite gegebene Koordinate abfällt (stellen Sie sich die Tafel mit [0 vor , 0] in der linken oberen Ecke).Prädikat zur Deklaration von absteigenden/aufsteigenden Koordinaten mit endlichen Domänen

Eine sehr einfache Implementierung in Prolog könnte wie folgt aussehen:

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

ich nicht dies obwohl in core.logic umzusetzen. Ich habe schon viele verschiedene Dinge ausprobiert (==/= fd/conso/appendo und + fd/+). Ich Eines der Dinge, versucht:

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

Die meisten von ihnen einfach nichts zurück, wenn sie wie folgt ausgeführt werden:

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

ich das Gefühl habe, dass zu viel in Prolog zu denken ist nicht gut, wenn der Kern verwendet wird. Logik ... jeder Hinweis geschätzt. Danke im Voraus.

EDIT: Gefunden eine Abhilfe, wo descendo gleich bleibt, aber wenn es läuft verwenden wir keine Domäne:

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

Ich bin nicht sicher, ob domain verwendet werden soll auf Vektoren sowieso, also ist dies möglicherweise kein Workaround, sondern die eigentliche Lösung.

+1

FD in core.logic sind nur für natürliche Zahlen und nicht für Vektoren usw. – Ankur

+7

bitte posten Sie Ihre Lösung als Lösung :-) – ordnungswidrig

Antwort

0

eine Abhilfe gefunden, wo descendo gleich bleibt, aber wenn es läuft verwenden wir keine Domäne:

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

Ich bin nicht sicher, ob Domain ohnehin auf Vektoren verwendet werden soll, so Dies ist möglicherweise kein Workaround, sondern die eigentliche Lösung.