es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué los predicados lógicos “y” no funcionan?

Probado en datascript 1.3.0

datoms:

[{:db/id -1 :name "Smith" :firstname "Oliver" :age 20}
 {:db/id -2 :name "Jones" :firstname "Oliver" :age 20}
 {:db/id -3 :name "Smith" :firstname "Amelia" :age 16}
 {:db/id -4 :name "Jones" :firstname "Amelia" :age 16}]

Intenté consultar con predicados lógicos y a continuación, quienes se llaman Smith y tienen más de 18 años, ¿por qué devolvió el conjunto completo sin filtrar?

'[:find ?firstname ?name
  :where
  [?p :name ?name]
  [?p :firstname ?firstname]
  [?p :age ?age]
  [(and (= ?name "Smith") (> ?age 18))]]

;; Wrong result: #{[Oliver Smith] [Oliver Jones] [Amelia Smith] [Amelia Jones]}

Luego cambié la consulta con predicados discretos y obtuve el resultado satisfactorio esperado.
```clj
'[:find ?firstname ?name
  :where
  [?p :name ?name]
  [?p :firstname ?firstname]
  [?p :age ?age]
  [(= ?name "Smith")]
  [(> ?age 18)]]

;; Correct result: #{[Oliver Smith]}

¿Datomic, Datascript o Datalog en general solo admiten patrones de datos dispersos en cláusulas discretas? ¿Las operaciones lógicas convencionales como y son incompatibles aquí?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    No, datomic, datascript y datalog en general no solo admiten patrones de datos dispersos en cláusulas discretas. Si admiten operaciones lógicas como and, or y not. El problema con la consulta inicial que usa predicados and es que la operación and no es componible en datalog. En su lugar, se recomienda separar los predicados en cláusulas separadas, como se muestra en la segunda consulta corregida. Esto hace que la consulta sea más legible y más fácil de razonar. Entonces, aunque se pueden usar operaciones lógicas en datalog, a menudo es mejor evitarlas cuando sea posible y, en su lugar, dividir las consultas en cláusulas separadas.

Comments are closed.