Je voudrais écrire un prédicat, descendo, qui déclare que la première coordonnée donnée [y, x] est de descendre à la deuxième coordonnée donnée (imaginez le conseil d'administration avec [0, 0] dans le coin supérieur gauche).
Très simple de mise en œuvre dans le Prologue pourrait ressembler à ceci:
descending(B, A) :-
B = [B1,B2],
A = [A1,A2],
B1 is A1 + 1,
B2 is A2 + 1.
Je n'arrive pas à l'appliquer dans le noyau.logique. J'ai essayé beaucoup de choses déjà (==/=fd/conso/appendo et +fd/+). L'une des choses que j'ai essayé:
(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)))
La plupart d'entre eux juste retour de rien lors de l'exécution comme ceci:
(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])
J'ai le sentiment que le fait de trop penser en Prolog n'est pas bon lors de l'utilisation de base.la logique...tout soupçon apprécié. Merci à l'avance.
EDIT: Trouvé une solution de contournement, où descendo reste le même, mais lors de l'exécution, nous ne pas utiliser un nom de domaine:
(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])
Je ne suis pas sûr qu' domain
est destiné à être utilisé sur des vecteurs de toute façon, ce ne serait pas une solution, mais la solution réelle.