Bug fix for disequations
Correctly eliminate dqs where the lhs is a parameter. (Eliminate them if there is only one for a given parameter, otherwise keep them.) Also, add path compression for lvar lookup.
This commit is contained in:
parent
b982c4dd6c
commit
1b08b03262
|
@ -31,6 +31,7 @@
|
|||
(struct-out unif-fail)
|
||||
not-failed?
|
||||
dq
|
||||
dq-dq
|
||||
predef-pat?
|
||||
unique-name-nums
|
||||
fresh-pat-vars
|
||||
|
@ -317,23 +318,47 @@
|
|||
(define (param-elim params unquantified-dq)
|
||||
(let loop ([dq-rest unquantified-dq]
|
||||
[ps params]
|
||||
[new-dq-l '()]
|
||||
[new-dq-r '()])
|
||||
[new-dq-l '()]
|
||||
[new-dq-r '()]
|
||||
[lhs-ps (hash)])
|
||||
(match dq-rest
|
||||
['((list) (list))
|
||||
(values ps `((list ,@new-dq-l) (list ,@new-dq-r)))]
|
||||
['((list) (list))
|
||||
(define-values
|
||||
(ndql ndqr nps)
|
||||
(for/fold ([ndql new-dq-l] [ndqr new-dq-r] [nps ps])
|
||||
([(p lhss) (in-hash lhs-ps)])
|
||||
(if ((length lhss) . > . 1)
|
||||
(values (foldr cons ndql lhss)
|
||||
(foldr cons ndqr (build-list (length lhss)
|
||||
(λ (_) p)))
|
||||
nps)
|
||||
(values ndql
|
||||
ndqr
|
||||
(remove (list-ref p 1) nps)))))
|
||||
(values nps `((list ,@ndql) (list ,@ndqr)))]
|
||||
[`((list (name ,v1,(bound)) ,vs ...) (list ,t1 ,ts ...))
|
||||
(cond
|
||||
[(member v1 params)
|
||||
[(member v1 params)
|
||||
(loop `((list ,@vs) (list ,@ts))
|
||||
(remove v1 ps)
|
||||
new-dq-l
|
||||
new-dq-r)]
|
||||
new-dq-r
|
||||
lhs-ps)]
|
||||
[(match t1
|
||||
[`(name ,tn ,(bound)) (member tn ps)]
|
||||
[_ #f])
|
||||
(loop `((list ,@vs) (list ,@ts))
|
||||
ps
|
||||
new-dq-l
|
||||
new-dq-r
|
||||
(hash-set lhs-ps t1 (cons `(name ,v1 ,(bound))
|
||||
(hash-ref lhs-ps t1 '()))))]
|
||||
[else
|
||||
(loop `((list ,@vs) (list ,@ts))
|
||||
ps
|
||||
(cons `(name ,v1 ,(bound)) new-dq-l)
|
||||
(cons t1 new-dq-r))])])))
|
||||
(cons t1 new-dq-r)
|
||||
lhs-ps)])])))
|
||||
|
||||
|
||||
;; the "root" pats will be pats without names,
|
||||
|
@ -738,7 +763,9 @@
|
|||
(define res (hash-ref env (lvar id) (λ () #f)))
|
||||
(match res
|
||||
[(lvar new-id)
|
||||
(lookup new-id env)]
|
||||
(define-values (rep pat) (lookup new-id env))
|
||||
(hash-set! env (lvar id) rep)
|
||||
(values rep pat)]
|
||||
[_
|
||||
(values (lvar id) res)]))
|
||||
|
||||
|
@ -835,4 +862,4 @@
|
|||
(define (make-uid id)
|
||||
(let ([uid-num (unique-name-nums)])
|
||||
(unique-name-nums (add1 uid-num))
|
||||
(string->symbol (string-append (symbol->string id) "_" (number->string uid-num)))))
|
||||
(string->symbol (string-append (symbol->string id) "_" (number->string uid-num)))))
|
||||
|
|
Loading…
Reference in New Issue
Block a user