{
  "revision": "9be7804c933cc8a3c51af3d8a5e4f54b012c8be6",
  "started_utc": "2026-09-26T03:00:21.878926+00:00",
  "python": "3.12.10",
  "platform": "Windows-11-10.0.26200-SP0",
  "swi": "SWI-Prolog version 10.0.2 for x64-win64",
  "script_sha256": "7f7b23847fe0c607e323513b10ffae90fb8e15d04e76b793a1ea260bce5ad781",
  "cases": [
    {
      "id": "rules",
      "query": "g(a,c)",
      "program": "p(a,b). p(b,c). g(X,Z) :- p(X,Y), p(Y,Z).",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 1,
        "answers": [
          "{}"
        ],
        "steps": 6
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[g(a,c)]\n",
        "stderr": ""
      }
    },
    {
      "id": "occurs-check",
      "query": "X = f(X)",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 0,
        "answers": [],
        "steps": 1
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n@([=(_2418,f(_2418))],[=(_2418,f(_2418))])\n",
        "stderr": ""
      }
    },
    {
      "id": "numeric-types",
      "query": "1 \\= 1.0",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 1,
        "answers": [
          "{}"
        ],
        "steps": 1
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[\\=(1,1.0)]\n",
        "stderr": ""
      }
    },
    {
      "id": "double-quotes",
      "query": "atom(\"abc\")",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 1,
        "answers": [
          "{}"
        ],
        "steps": 1
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=0\n[]\n",
        "stderr": ""
      }
    },
    {
      "id": "character-code",
      "query": "X is 0'a, X = 97",
      "program": "",
      "rewrite": {
        "outcome": "exception",
        "phase": "query",
        "type": "SyntaxErrorInSource",
        "message": "unterminated quoted atom (opened with ') at <query>:1:7\n  X is 0'a, X = 97"
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[','(is(97,97),=(97,97))]\n",
        "stderr": ""
      }
    },
    {
      "id": "operators",
      "query": "op(500, xfy, likes)",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 0,
        "answers": [],
        "steps": 1
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[op(500,xfy,likes)]\n",
        "stderr": ""
      }
    },
    {
      "id": "duplicates",
      "query": "p(X)",
      "program": "p(a). p(a).",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 1,
        "answers": [
          "{X=a}"
        ],
        "steps": 3
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=2\n[p(a),p(a)]\n",
        "stderr": ""
      }
    },
    {
      "id": "duplicates-opt-out",
      "query": "p(X)",
      "program": "p(a). p(a).",
      "distinct": false,
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 2,
        "answers": [
          "{X=a}",
          "{X=a}"
        ],
        "steps": 3
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=2\n[p(a),p(a)]\n",
        "stderr": ""
      }
    },
    {
      "id": "cut",
      "query": "p(X)",
      "program": "p(a) :- !. p(b).",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 1,
        "answers": [
          "{X=a}"
        ],
        "steps": 2
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[p(a)]\n",
        "stderr": ""
      }
    },
    {
      "id": "if-then-else",
      "query": "(fail -> fail ; true)",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 1,
        "answers": [
          "{}"
        ],
        "steps": 3
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[;(->(fail,fail),true)]\n",
        "stderr": ""
      }
    },
    {
      "id": "soft-cut",
      "query": "(member(X,[a,b]) *-> true ; fail)",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 2,
        "answers": [
          "{X=a}",
          "{X=b}"
        ],
        "steps": 7
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=2\n[;(*->(member(a,[a,b]),true),fail),;(*->(member(b,[a,b]),true),fail)]\n",
        "stderr": ""
      }
    },
    {
      "id": "negation",
      "query": "\\+ (X = a, fail), var(X)",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 1,
        "answers": [
          "{X=X}"
        ],
        "steps": 6
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[','(\\+(','(=(A,a),fail)),var(A))]\n",
        "stderr": ""
      }
    },
    {
      "id": "meta-call",
      "query": "call(member, a, [a,b]), once(member(a,[a,a]))",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 1,
        "answers": [
          "{}"
        ],
        "steps": 9
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[','(call(member,a,[a,b]),once(member(a,[a,a])))]\n",
        "stderr": ""
      }
    },
    {
      "id": "arithmetic",
      "query": "A is -10 // 3, B is -10 div 3, A = -3, B = -4",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 1,
        "answers": [
          "{A=-3, B=-4}"
        ],
        "steps": 7
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[','(is(-3,//(-10,3)),','(is(-4,div(-10,3)),','(=(-3,-3),=(-4,-4))))]\n",
        "stderr": ""
      }
    },
    {
      "id": "arithmetic-error",
      "query": "X is a + 1",
      "program": "",
      "rewrite": {
        "outcome": "exception",
        "phase": "query",
        "type": "TypeCheckError",
        "message": "type error in arithmetic expression: expected evaluable, got 'a/0'"
      },
      "swi": {
        "returncode": 2,
        "stdout": "error(type_error(evaluable,/(a,0)),context(:(system,/(is,2)),_))\n",
        "stderr": ""
      }
    },
    {
      "id": "lists",
      "query": "append([a],[b],L), L = [a,b], member(b,L), length(L,2)",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 1,
        "answers": [
          "{L=[a, b]}"
        ],
        "steps": 14
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[','(append([a],[b],[a,b]),','(=([a,b],[a,b]),','(member(b,[a,b]),length([a,b],2))))]\n",
        "stderr": ""
      }
    },
    {
      "id": "findall",
      "query": "findall(X,p(X),L), L = [a,a]",
      "program": "p(a). p(a).",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 1,
        "answers": [
          "{X=X, L=[a, a]}"
        ],
        "steps": 6
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[','(findall(A,p(A),[a,a]),=([a,a],[a,a]))]\n",
        "stderr": ""
      }
    },
    {
      "id": "bagof-setof",
      "query": "bagof(X,p(X),B), B=[b,a,a], setof(X,p(X),S), S=[a,b]",
      "program": "p(b). p(a). p(a).",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 1,
        "answers": [
          "{X=X, B=[b, a, a], S=[a, b]}"
        ],
        "steps": 15
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[','(bagof(A,p(A),[b,a,a]),','(=([b,a,a],[b,a,a]),','(setof(A,p(A),[a,b]),=([a,b],[a,b]))))]\n",
        "stderr": ""
      }
    },
    {
      "id": "sort",
      "query": "sort([b,a,a],S), S=[a,b], msort([b,a,a],M), M=[a,a,b]",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 1,
        "answers": [
          "{S=[a, b], M=[a, a, b]}"
        ],
        "steps": 15
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[','(sort([b,a,a],[a,b]),','(=([a,b],[a,b]),','(msort([b,a,a],[a,a,b]),=([a,a,b],[a,a,b]))))]\n",
        "stderr": ""
      }
    },
    {
      "id": "term-inspection",
      "query": "f(a,b) =.. L, L=[f,a,b], functor(f(a,b),f,2), arg(2,f(a,b),b)",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 1,
        "answers": [
          "{L=[f, a, b]}"
        ],
        "steps": 7
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[','(=..(f(a,b),[f,a,b]),','(=([f,a,b],[f,a,b]),','(functor(f(a,b),f,2),arg(2,f(a,b),b))))]\n",
        "stderr": ""
      }
    },
    {
      "id": "atom-conversion",
      "query": "atom_concat(ab,cd,abcd), atom_length(abcd,4), atom_number('42',42)",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 1,
        "answers": [
          "{}"
        ],
        "steps": 5
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[','(atom_concat(ab,cd,abcd),','(atom_length(abcd,4),atom_number('42',42)))]\n",
        "stderr": ""
      }
    },
    {
      "id": "unknown",
      "query": "missing_feature_probe",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 0,
        "answers": [],
        "steps": 1
      },
      "swi": {
        "returncode": 2,
        "stdout": "error(existence_error(procedure,/(missing_feature_probe,0)),context(:('$bags',/(findall_loop,4)),_))\n",
        "stderr": ""
      }
    },
    {
      "id": "unknown-strict",
      "query": "missing_feature_probe",
      "program": "",
      "unknown_fails": false,
      "rewrite": {
        "outcome": "exception",
        "phase": "query",
        "type": "UnknownPredicateError",
        "message": "unknown predicate: missing_feature_probe/0"
      },
      "swi": {
        "returncode": 2,
        "stdout": "error(existence_error(procedure,/(missing_feature_probe,0)),context(:('$bags',/(findall_loop,4)),_))\n",
        "stderr": ""
      }
    },
    {
      "id": "left-recursion",
      "query": "path(a,Y)",
      "program": "edge(a,b). edge(b,c). path(X,Y) :- path(X,Z), edge(Z,Y). path(X,Y) :- edge(X,Y).",
      "swi_prefix": ":- table path/2.\n",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 2,
        "answers": [
          "{Y=b}",
          "{Y=c}"
        ],
        "steps": 23
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=2\n[path(a,b),path(a,c)]\n",
        "stderr": ""
      }
    },
    {
      "id": "recursive-cut",
      "query": "p(a)",
      "program": "p(a) :- !. p(X) :- p(X).",
      "rewrite": {
        "outcome": "exception",
        "phase": "query",
        "type": "SemanticConflict",
        "message": "p/1 is evaluated by tabling (because it is recursive) but <string>:1 contains a cut. A cut has no sound reading under fixpoint evaluation. Remove the cut, or restructure so the recursive predicate has no cut."
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[p(a)]\n",
        "stderr": ""
      }
    },
    {
      "id": "recursive-negation",
      "query": "win(b)",
      "program": "move(a,b). move(b,c). win(X) :- move(X,Y), \\+ win(Y).",
      "rewrite": {
        "outcome": "exception",
        "phase": "query",
        "type": "SemanticConflict",
        "message": "negation is not stratified: the predicates {win/1} depend on their own negation, so the program has no single intended model. Break the cycle (usually by making the negated goal refer to a separate, non-recursive predicate)."
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[win(b)]\n",
        "stderr": ""
      }
    },
    {
      "id": "exceptions",
      "query": "catch(throw(ball),ball,true)",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 0,
        "answers": [],
        "steps": 1
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[catch(throw(ball),ball,true)]\n",
        "stderr": ""
      }
    },
    {
      "id": "dynamic-database",
      "query": "assertz(probe_fact(a)), probe_fact(a), retract(probe_fact(a))",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 0,
        "answers": [],
        "steps": 2
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[','(assertz(probe_fact(a)),','(probe_fact(a),retract(probe_fact(a))))]\n",
        "stderr": ""
      }
    },
    {
      "id": "dcg",
      "query": "phrase(s,[a])",
      "program": "s --> [a].",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 0,
        "answers": [],
        "steps": 1
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[phrase(s,[a])]\n",
        "stderr": ""
      }
    },
    {
      "id": "modules",
      "query": "lists:member(a,[a])",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 0,
        "answers": [],
        "steps": 1
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[:(lists,member(a,[a]))]\n",
        "stderr": ""
      }
    },
    {
      "id": "constraints",
      "query": "X #= 2, X #> 1",
      "program": "",
      "swi_prefix": ":- use_module(library(clpfd)).\n",
      "rewrite": {
        "outcome": "exception",
        "phase": "query",
        "type": "SyntaxErrorInSource",
        "message": "unexpected trailing input starting at '#=' at <query>:1:3"
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[','(#=(2,2),#>(2,1))]\n",
        "stderr": ""
      }
    },
    {
      "id": "dif",
      "query": "dif(X,a), X=b",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 0,
        "answers": [],
        "steps": 2
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[','(dif(b,a),=(b,b))]\n",
        "stderr": ""
      }
    },
    {
      "id": "freeze",
      "query": "freeze(X, X=b), X=b",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 0,
        "answers": [],
        "steps": 2
      },
      "swi": {
        "returncode": 0,
        "stdout": "\nCOUNT=1\n[','(freeze(b,=(b,b)),=(b,b))]\n",
        "stderr": ""
      }
    },
    {
      "id": "io",
      "query": "write(probe_output)",
      "program": "",
      "rewrite": {
        "outcome": "returned",
        "status": "complete",
        "count": 0,
        "answers": [],
        "steps": 1
      },
      "swi": {
        "returncode": 0,
        "stdout": "probe_output\nCOUNT=1\n[write(probe_output)]\n",
        "stderr": ""
      }
    }
  ],
  "finished_utc": "2026-09-26T03:00:41.722979+00:00"
}
