[differential] programs evaluated: 600 (unstratified: 61, predicate-relations compared: 3234) == 1. full unittest suite (the CHECK command runs this same suite) ........................................ ---------------------------------------------------------------------- Ran 40 tests in 1.022s OK testsRun=40 failures=0 errors=0 == 2. semi-naive vs naive work on a chain transitive closure n |path| semi-naive naive speedup rounds 6 15 105 300 2.9x 5 12 66 858 5687 6.6x 11 16 120 2040 18825 9.2x 15 20 190 3990 47291 11.9x 19 == 3. fresh-seed differential run: 400 programs, engine vs oracle programs=400 unstratified=43 predicate-relations compared=2142 mismatches=0 == 4. strata assignment + refusal of a non-stratified program strata: [['edge'], ['node'], ['source'], ['reach'], ['unreach']] reach: [('a',), ('b',)] unreach: [('c',)] refused: negation is not stratified: p negates q but they are mutually recursive (SCC: p, q) ALL SECTIONS CLEAN == 5. CLI on examples/reach.dl (appended by hand, not by evidence_run.py) $ python3 datalog.py examples/reach.dl --text --stats edge: 2 tuple(s) edge(a, b). edge(b, c). node: 4 tuple(s) node(a). node(b). node(c). node(d). reach: 3 tuple(s) reach(a). reach(b). reach(c). sink: 2 tuple(s) sink(c). sink(d). source: 1 tuple(s) source(a). unreachable: 1 tuple(s) unreachable(d). {"bindings": 20, "derived": 6, "rounds": 5, "rule_runs": 6} exit=0 $ python3 datalog.py examples/reach.dl -q unreachable { "predicates": { "unreachable": [ [ "d" ] ] }, "strata": [ [ "edge" ], [ "node" ], [ "sink" ], [ "source" ], [ "reach" ], [ "unreachable" ] ] } exit=0