diff options
| author | Marcos Magueta <maguetamarcos@gmail.com> | 2026-07-11 22:12:53 -0300 |
|---|---|---|
| committer | Marcos Magueta <maguetamarcos@gmail.com> | 2026-07-11 22:12:53 -0300 |
| commit | 0886f3c71cf8551e4f8b3726654003a4f29645f0 (patch) | |
| tree | 884176834dc4f20b0af2cf4ab72c48b945203107 /docs/vm.org | |
| parent | f22834d3aaed2b2dd2c5d4203e937fc8fb4b5507 (diff) | |
| download | SOL-0886f3c71cf8551e4f8b3726654003a4f29645f0.tar.gz SOL-0886f3c71cf8551e4f8b3726654003a4f29645f0.zip | |
residuation: open membership returns residual constraints
Diffstat (limited to '')
| -rw-r--r-- | docs/vm.org | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/docs/vm.org b/docs/vm.org index 4253231..8d1215a 100644 --- a/docs/vm.org +++ b/docs/vm.org @@ -56,9 +56,14 @@ decidable wait. So conjunction stays commutative in fact, not just in doctrine: the page order of =:and= operands never matters, and the tests assert it. -If no remaining goal can ever run, the plan is rejected as non -total. =[Integer value: X]= alone is not an enumeration, it is an -error telling you to bind or bound =X=. Membership is not generation. +When goals remain that cannot run, two things can happen. If every +one of them is pure membership, decidable the moment its variables +ground, the answer comes back with those goals as residual +constraints: =[Integer value: X]= alone answers =X= conditioned on +=[Integer value: X]=, which is exactly what the expression means. +Constraining is not searching. If any remaining goal is a stalled +search, an unbounded recursion or an infinite universal, the plan is +rejected as non total. Membership is never generation either way. Recursive rules unfold only when their witness argument is ground, so the admission proof becomes a runtime termination measure: the |
