maude: owise (otherwise) equations (8 tests, 229 total)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 40s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 40s
Parser reads trailing eq attributes (eq L = R [owise] .) via mau/split-attrs. mau/crewrite-top is two-pass: ordinary equations first, owise last — an owise catch-all fires only when no ordinary equation applies, regardless of declaration order. Verified a catch-all declared first still defers. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
;; lib/maude/conditional.sx — conditional equations (Phase 4).
|
||||
;; lib/maude/conditional.sx — conditional equations (Phase 4) + owise.
|
||||
;;
|
||||
;; A condition-aware superset of the Phase 3 reducer. `ceq L = R if COND` fires
|
||||
;; only when COND holds under the matching substitution. Conditions come from
|
||||
@@ -10,10 +10,13 @@
|
||||
;; — termination rests on the guard reducing on structurally smaller arguments
|
||||
;; (and the global fuel guard).
|
||||
;;
|
||||
;; `owise` (otherwise): an equation tagged [owise] fires at a redex only when
|
||||
;; NO ordinary equation applies there. crewrite-top is two-pass: ordinary
|
||||
;; equations first, owise equations last.
|
||||
;;
|
||||
;; Single-step firing uses the short-circuiting matcher in fire.sx
|
||||
;; (mau/fire-eq) so reduction is not quadratic/exponential in AC argument size.
|
||||
;; The eager candidate enumeration (mau/eq-candidates) is retained for `search`
|
||||
;; (rewrite.sx), which genuinely needs every successor.
|
||||
;; (mau/fire-eq). The eager candidate enumeration (mau/eq-candidates) is
|
||||
;; retained for `search` (rewrite.sx), which genuinely needs every successor.
|
||||
|
||||
(define
|
||||
mau/ac-candidates
|
||||
@@ -86,6 +89,14 @@
|
||||
(get c :result)
|
||||
(mau/try-candidates theory all-eqs cond term (rest cands)))))))
|
||||
|
||||
;; ---- owise partitioning ----
|
||||
|
||||
(define mau/eq-owise? (fn (e) (= (get e :owise) true)))
|
||||
(define mau/filter-owise (fn (eqs) (filter mau/eq-owise? eqs)))
|
||||
(define
|
||||
mau/filter-noowise
|
||||
(fn (eqs) (filter (fn (e) (not (mau/eq-owise? e))) eqs)))
|
||||
|
||||
(define
|
||||
mau/crewrite-loop
|
||||
(fn
|
||||
@@ -99,7 +110,14 @@
|
||||
|
||||
(define
|
||||
mau/crewrite-top
|
||||
(fn (theory eqs term) (mau/crewrite-loop theory eqs eqs term)))
|
||||
(fn
|
||||
(theory eqs term)
|
||||
(let
|
||||
((r (mau/crewrite-loop theory eqs (mau/filter-noowise eqs) term)))
|
||||
(if
|
||||
(= r nil)
|
||||
(mau/crewrite-loop theory eqs (mau/filter-owise eqs) term)
|
||||
r))))
|
||||
|
||||
(define
|
||||
mau/cnormalize
|
||||
|
||||
Reference in New Issue
Block a user