tonsky / datascript

Immutable database and Datalog query engine for Clojure, ClojureScript and JS
Eclipse Public License 1.0
5.47k stars 304 forks source link

Rules error #239

Open Tavistock opened 6 years ago

Tavistock commented 6 years ago

After asking a couple of questions on the datascript slack, @tonsky asked me to make a gist with my error in it. The function (connected x y) should return a set of all diagonal neighbors of neighbors on a cartesian grid but in cases where the (= x y) it ignores neighbors that are also (= x y).

The gist is at https://gist.github.com/Tavistock/6305de1b890e3a60489544ae139b102f. for background this is for implementing a game of checkers or draughts.

This image shows the degenerate case where the orange highlighted checker is selected and the green squares are it's connected. Notice that (= x y) for the checker.

screen shot 2017-11-04 at 2 30 19 pm

This image shows the correct highlighting when selecting a different piece and using connected. Notice that (!= x y) for the checker.

screen shot 2017-11-04 at 2 30 34 pm

My question is whether there is an error in my code and reasoning, or if this is a problem with Datascript.

Harleqin commented 6 years ago

I'm not sure, but shouldn't the near definition use a predicate?

[(near ?i1 ?i2)
 [(= (inc ?i1) ?i2)]]
[(near ?i1 ?i2)
 [(= (dec ?i1) ?i2)]]
tonsky commented 6 years ago

@Harleqin it’s actually fine. Predicate would work if both i1 and i2 are bound, what @Tavistock has is assignment, given the value of i1, calculate and assign value of i2