28 votes

Prédicat pour déclarer des coordonnées décroissantes / ascendantes en utilisant des domaines finis

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.

0voto

naeg Points 1737

Trouvé une solution de contournement, où descendo reste le même, mais lors de son exécution, nous n'utilisons pas 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 sais pas si le domaine est censé être utilisé sur les vecteurs de toute façon, donc ce n'est peut-être pas une solution de contournement mais la solution réelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X