From 96714934b6c7aee7fc756218243b2fdd2e152d8a Mon Sep 17 00:00:00 2001 From: Burke Fetscher Date: Tue, 30 Sep 2014 17:28:56 -0500 Subject: [PATCH] redex: try harder when checking non-terminals Unfold non-terminals other than the one we're currently checking, and follow variable references, when normalizing patterns for nt checking. --- .../redex-doc/redex/scribblings/ref.scrbl | 15 ++ .../redex-lib/redex/private/pat-unify.rkt | 141 ++++++++++-------- .../redex-test/redex/tests/unify-tests.rkt | 27 ++++ 3 files changed, 120 insertions(+), 63 deletions(-) diff --git a/pkgs/redex-pkgs/redex-doc/redex/scribblings/ref.scrbl b/pkgs/redex-pkgs/redex-doc/redex/scribblings/ref.scrbl index fa00ca077e..fdb4029f5a 100644 --- a/pkgs/redex-pkgs/redex-doc/redex/scribblings/ref.scrbl +++ b/pkgs/redex-pkgs/redex-doc/redex/scribblings/ref.scrbl @@ -2199,6 +2199,21 @@ with @racket[#:satisfying].} (sum nat_1 nat_2 nat_3) (equal? (term nat_1) (term nat_2)))] +@defparam[depth-dependent-order? depth-dependent boolean? + #:value #t]{ + +Toggles whether or not redex will dynamically adjust the +chance that more recursive clauses of judgment forms or metafunctions +are chosen earlierwhen attempting to generate terms +with forms that use @racket[#:satisfying]. It is @racket[#t] by +default, which causes redex to favor more recursive clauses at +lower depths and less recursive clauses at depths closer to the +limit, in an attempt to generate larger terms. When it is +@racket[#f], all clause orderings have equal probability +above the bound. + +} + @defform/subs[(redex-generator language-id satisfying size-expr) ([satisfying (judgment-form-id @#,ttpattern ...) (code:line (metafunction-id @#,ttpattern ...) = @#,ttpattern)]) diff --git a/pkgs/redex-pkgs/redex-lib/redex/private/pat-unify.rkt b/pkgs/redex-pkgs/redex-lib/redex/private/pat-unify.rkt index 996e154293..694523c92d 100644 --- a/pkgs/redex-pkgs/redex-lib/redex/private/pat-unify.rkt +++ b/pkgs/redex-pkgs/redex-lib/redex/private/pat-unify.rkt @@ -85,7 +85,11 @@ (define predef-pats (set 'any 'number 'string 'integer 'boolean 'real 'variable 'natural 'variable-not-otherwise-mentioned)) (define (predef-pat? a) - (set-member? predef-pats a)) + (or (set-member? predef-pats a) + (match a + [`(variable-except ,_ ...) #t] + [`(variable-prefix ,_) #t] + [_ #f]))) (define (var? s) (symbol? s)) (define (n-t? s) @@ -573,7 +577,7 @@ (and/fail new-nts (p*e `(cstr ,new-nts ,new-p) res-e))] [_ - (and/fail (for/and ([n nts]) (check-nt n L res-p)) + (and/fail (for/and ([n nts]) (check-nt n L res-p e)) (p*e `(cstr ,nts ,res-p) res-e))]))) (define (u*-2nts n-t n-u e L) @@ -583,7 +587,7 @@ (define (u*-1nt p u e L) (and/fail - (check-nt p L u) + (check-nt p L u e) (if (hash-has-key? (compiled-lang-collapsible-nts L) p) (maybe-let ([bn-res (bind-names (fresh-pat-vars (hash-ref (compiled-lang-collapsible-nts L) p) (make-hash)) e L)]) (unify* (p*e-p bn-res) u (p*e-e bn-res) L)) @@ -773,7 +777,7 @@ (define (merge-ids/sorted l1 l2 lang) (and (for*/and ([nt1 l1] [nt2 l2]) - (check-nt nt1 lang `(nt ,l2))) + (check-nt nt1 lang `(nt ,nt2) empty-env)) (de-dupe/sorted (merge/sorted l1 l2)))) (define (symbol