aboutsummaryrefslogtreecommitdiffstats
path: root/docs/vm.org
diff options
context:
space:
mode:
authorMarcos Magueta <maguetamarcos@gmail.com>2026-07-11 22:12:53 -0300
committerMarcos Magueta <maguetamarcos@gmail.com>2026-07-11 22:12:53 -0300
commit0886f3c71cf8551e4f8b3726654003a4f29645f0 (patch)
tree884176834dc4f20b0af2cf4ab72c48b945203107 /docs/vm.org
parentf22834d3aaed2b2dd2c5d4203e937fc8fb4b5507 (diff)
downloadSOL-0886f3c71cf8551e4f8b3726654003a4f29645f0.tar.gz
SOL-0886f3c71cf8551e4f8b3726654003a4f29645f0.zip
residuation: open membership returns residual constraints
Diffstat (limited to 'docs/vm.org')
-rw-r--r--docs/vm.org11
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