redex: favor recursive rules above the bound
This commit is contained in:
parent
a3412354b8
commit
a3e00ac87c
|
@ -72,9 +72,10 @@
|
||||||
(fresh-pat-vars input (make-hash))
|
(fresh-pat-vars input (make-hash))
|
||||||
(set! name-nums (unique-name-nums)))))
|
(set! name-nums (unique-name-nums)))))
|
||||||
(define fs (list (fail-cont empty-env
|
(define fs (list (fail-cont empty-env
|
||||||
(list (make-partial-rule fresh-pat (if (shuffle-clauses?)
|
(list (make-partial-rule fresh-pat
|
||||||
(shuffle clauses)
|
(if (shuffle-clauses?)
|
||||||
(order-clauses clauses))
|
(shuffle/favor-recursive-clauses clauses)
|
||||||
|
(order-clauses clauses))
|
||||||
'() bound))
|
'() bound))
|
||||||
bound)))
|
bound)))
|
||||||
(define v-locs (make-hash))
|
(define v-locs (make-hash))
|
||||||
|
@ -159,7 +160,7 @@
|
||||||
(make-partial-rule (prem-pat prem)
|
(make-partial-rule (prem-pat prem)
|
||||||
(if (positive? bound)
|
(if (positive? bound)
|
||||||
(if (shuffle-clauses?)
|
(if (shuffle-clauses?)
|
||||||
(shuffle prem-cls)
|
(shuffle/favor-recursive-clauses clauses)
|
||||||
(order-clauses prem-cls))
|
(order-clauses prem-cls))
|
||||||
(order-clauses prem-cls))
|
(order-clauses prem-cls))
|
||||||
(cons n tr-loc)
|
(cons n tr-loc)
|
||||||
|
@ -170,23 +171,31 @@
|
||||||
new-fringe
|
new-fringe
|
||||||
(cons (fail-cont env failure-fringe bound) fail))])]))
|
(cons (fail-cont env failure-fringe bound) fail))])]))
|
||||||
|
|
||||||
|
(define (shuffle/favor-recursive-clauses cs)
|
||||||
|
(define candidates (apply append
|
||||||
|
(for/list ([c (in-list cs)])
|
||||||
|
(make-list (add1 (length (clause-prems c))) c))))
|
||||||
|
(let loop ([candidates candidates])
|
||||||
|
(cond
|
||||||
|
[(null? candidates) null]
|
||||||
|
[else
|
||||||
|
(define selected (list-ref candidates (random (length candidates))))
|
||||||
|
(cons selected (loop (remove* (list selected) candidates)))])))
|
||||||
|
|
||||||
(define (order-clauses cs)
|
(define (order-clauses cs)
|
||||||
(define num-prems->cs (hash))
|
(define num-prems->cs (make-hash))
|
||||||
(for ([c cs])
|
(for ([c (in-list cs)])
|
||||||
(set! num-prems->cs
|
(hash-set! num-prems->cs
|
||||||
(hash-set num-prems->cs
|
(length (clause-prems c))
|
||||||
(length (clause-prems c))
|
(set-add
|
||||||
(set-add
|
(hash-ref num-prems->cs
|
||||||
(hash-ref num-prems->cs
|
(length (clause-prems c))
|
||||||
(length (clause-prems c))
|
(set))
|
||||||
(λ () (set)))
|
c)))
|
||||||
c))))
|
|
||||||
(apply append
|
(apply append
|
||||||
(for/list ([k (sort (hash-keys num-prems->cs) <)])
|
(for/list ([k (in-list (sort (hash-keys num-prems->cs) <))])
|
||||||
(shuffle (set->list (hash-ref num-prems->cs k))))))
|
(shuffle (set->list (hash-ref num-prems->cs k))))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(define (do-unification clse input env)
|
(define (do-unification clse input env)
|
||||||
(match-define (clause head-pat eq/dqs prems lang name) clse)
|
(match-define (clause head-pat eq/dqs prems lang name) clse)
|
||||||
(clause head-pat eq/dqs prems lang name)
|
(clause head-pat eq/dqs prems lang name)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user