¿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í?
davy.ai
No,
datomic
,datascript
ydatalog
en general no solo admiten patrones de datos dispersos en cláusulas discretas. Si admiten operaciones lógicas comoand
,or
ynot
. El problema con la consulta inicial que usa predicadosand
es que la operaciónand
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.