
[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
