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.
FD in core.logic sind nur für natürliche Zahlen und nicht für Vektoren usw. – Ankur
bitte posten Sie Ihre Lösung als Lösung :-) – ordnungswidrig