Fix expansion for relations in term positions.
Explicitly disables random generation for relations in term positions, but fixes a problem with runtime functionality for the same.
This commit is contained in:
parent
a04bfa5ba2
commit
76421ee786
|
@ -1291,11 +1291,13 @@
|
||||||
(free-identifier=? stx (quote-syntax ...))))
|
(free-identifier=? stx (quote-syntax ...))))
|
||||||
|
|
||||||
(define-for-syntax (where-keyword? id)
|
(define-for-syntax (where-keyword? id)
|
||||||
(or (free-identifier=? id #'where)
|
(and (identifier? id)
|
||||||
(free-identifier=? id #'where/hidden)))
|
(or (free-identifier=? id #'where)
|
||||||
|
(free-identifier=? id #'where/hidden))))
|
||||||
(define-for-syntax (side-condition-keyword? id)
|
(define-for-syntax (side-condition-keyword? id)
|
||||||
(or (free-identifier=? id #'side-condition)
|
(and (identifier? id)
|
||||||
(free-identifier=? id #'side-condition/hidden)))
|
(or (free-identifier=? id #'side-condition)
|
||||||
|
(free-identifier=? id #'side-condition/hidden))))
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
; ;
|
; ;
|
||||||
|
@ -1357,7 +1359,7 @@
|
||||||
(append (syntax->datum #'new-names) ns))))]
|
(append (syntax->datum #'new-names) ns))))]
|
||||||
[(side-cond . rest)
|
[(side-cond . rest)
|
||||||
(side-condition-keyword? #'side-cond)
|
(side-condition-keyword? #'side-cond)
|
||||||
;; TODO - side condition handling
|
;; TODO - enable side conditions for judgment form only
|
||||||
(values ps-rw eqs ns)]
|
(values ps-rw eqs ns)]
|
||||||
[(prem-name . prem-body)
|
[(prem-name . prem-body)
|
||||||
(and (judgment-form-id? #'prem-name) in-judgment-form?)
|
(and (judgment-form-id? #'prem-name) in-judgment-form?)
|
||||||
|
@ -1370,9 +1372,9 @@
|
||||||
;; TODO - fix when implementing ellipses
|
;; TODO - fix when implementing ellipses
|
||||||
(values ps-rw eqs ns)]
|
(values ps-rw eqs ns)]
|
||||||
[term
|
[term
|
||||||
(not in-judgment-form?) ;; in a relation
|
(not in-judgment-form?) ;; in a relation ;; TODO - eliminate this (relations become SCs)
|
||||||
(let-values ([(term-rws mf-cs) (rewrite-terms (list #'term) ns)])
|
(let-values ([(term-rws mf-cs) (rewrite-terms (list #'term) ns)])
|
||||||
(values (append mf-cs ps-rw)
|
(values (append mf-cs ps-rw)
|
||||||
eqs
|
eqs
|
||||||
ns))]
|
ns))]
|
||||||
[else (raise-syntax-error what "malformed premise" prem)])))
|
[else (raise-syntax-error what "malformed premise" prem)])))
|
||||||
|
@ -1397,7 +1399,9 @@
|
||||||
[((mf-clauses ...) ...) (map (λ (fs)
|
[((mf-clauses ...) ...) (map (λ (fs)
|
||||||
(map (λ (f-id)
|
(map (λ (f-id)
|
||||||
(with-syntax ([f-id f-id])
|
(with-syntax ([f-id f-id])
|
||||||
#'(metafunc-proc-gen-clauses f-id)))
|
(if (judgment-form-id? #'f-id)
|
||||||
|
#'(error 'generate-term "generation disabled for relations in term positions")
|
||||||
|
#'(metafunc-proc-gen-clauses f-id))))
|
||||||
(syntax->list fs)))
|
(syntax->list fs)))
|
||||||
(syntax->list #'((f ...) ...)))])
|
(syntax->list #'((f ...) ...)))])
|
||||||
(values (syntax->list #'(body-pat ...))
|
(values (syntax->list #'(body-pat ...))
|
||||||
|
|
|
@ -70,17 +70,17 @@
|
||||||
[(_ mf)
|
[(_ mf)
|
||||||
#'(λ (x) (mf x))]))
|
#'(λ (x) (mf x))]))
|
||||||
|
|
||||||
(define-syntax (mf-map stx)
|
|
||||||
(syntax-case stx ()
|
|
||||||
[(_ inner-apps)
|
|
||||||
#'(λ (l) (map inner-apps l))]))
|
|
||||||
|
|
||||||
(define-syntax (jf-apply stx)
|
(define-syntax (jf-apply stx)
|
||||||
(syntax-case stx ()
|
(syntax-case stx ()
|
||||||
[(_ jf)
|
[(_ jf)
|
||||||
(judgment-form-id? #'jf)
|
(judgment-form-id? #'jf)
|
||||||
(judgment-form-term-proc (syntax-local-value #'jf (λ () #f)))]))
|
(judgment-form-term-proc (syntax-local-value #'jf (λ () #f)))]))
|
||||||
|
|
||||||
|
(define-syntax (mf-map stx)
|
||||||
|
(syntax-case stx ()
|
||||||
|
[(_ inner-apps)
|
||||||
|
#'(λ (l) (map inner-apps l))]))
|
||||||
|
|
||||||
(define-for-syntax currently-expanding-term-fn (make-parameter #f))
|
(define-for-syntax currently-expanding-term-fn (make-parameter #f))
|
||||||
|
|
||||||
|
|
||||||
|
@ -318,7 +318,11 @@
|
||||||
[(mf-apply f)
|
[(mf-apply f)
|
||||||
(and (identifier? #'mf-apply)
|
(and (identifier? #'mf-apply)
|
||||||
(eq? (syntax-e #'mf-apply) 'mf-apply))
|
(eq? (syntax-e #'mf-apply) 'mf-apply))
|
||||||
#'(metafunc f)]))
|
#'(metafunc f)]
|
||||||
|
[(jf-apply f)
|
||||||
|
(and (identifier? #'jf-apply)
|
||||||
|
(eq? (syntax-e #'jf-apply) 'jf-apply))
|
||||||
|
#'(jform f)]))
|
||||||
|
|
||||||
(define-syntax (term-let-fn stx)
|
(define-syntax (term-let-fn stx)
|
||||||
(syntax-case stx ()
|
(syntax-case stx ()
|
||||||
|
|
|
@ -474,7 +474,7 @@
|
||||||
(test (with-handlers ([exn:fail? exn-message])
|
(test (with-handlers ([exn:fail? exn-message])
|
||||||
(generate-term L #:satisfying (f r_1) = r_2 +inf.0))
|
(generate-term L #:satisfying (f r_1) = r_2 +inf.0))
|
||||||
#rx".*generate-term:.*undatum.*"))
|
#rx".*generate-term:.*undatum.*"))
|
||||||
|
|
||||||
|
|
||||||
(let ()
|
(let ()
|
||||||
(define-language L (n 2))
|
(define-language L (n 2))
|
||||||
|
@ -499,14 +499,14 @@
|
||||||
(define-language l (n number))
|
(define-language l (n number))
|
||||||
|
|
||||||
(define-metafunction l
|
(define-metafunction l
|
||||||
[(t n n)
|
[(t n n)
|
||||||
1]
|
1]
|
||||||
[(t n 2)
|
[(t n 2)
|
||||||
2]
|
2]
|
||||||
[(t 1 n)
|
[(t 1 n)
|
||||||
3]
|
3]
|
||||||
[(t n_1 n_2)
|
[(t n_1 n_2)
|
||||||
4])
|
4])
|
||||||
|
|
||||||
(test-equal (generate-term l #:satisfying (t 1 1) = 1 +inf.0)
|
(test-equal (generate-term l #:satisfying (t 1 1) = 1 +inf.0)
|
||||||
'((t 1 1) = 1))
|
'((t 1 1) = 1))
|
||||||
|
@ -567,3 +567,34 @@
|
||||||
(raise e))])
|
(raise e))])
|
||||||
(for ([n 10])
|
(for ([n 10])
|
||||||
(g)))))
|
(g)))))
|
||||||
|
|
||||||
|
(let ()
|
||||||
|
(define-language L0)
|
||||||
|
(define-relation L0
|
||||||
|
[(a any)])
|
||||||
|
(define-relation L0
|
||||||
|
[(b any)])
|
||||||
|
(define-relation L0
|
||||||
|
[(c any) (a (b any))])
|
||||||
|
|
||||||
|
(define-metafunction L0
|
||||||
|
[(f any)
|
||||||
|
(a ny)])
|
||||||
|
|
||||||
|
(define-judgment-form L0
|
||||||
|
#:mode (J I O)
|
||||||
|
[(J any_1 any_2)
|
||||||
|
(J (a any_1) any_2)]
|
||||||
|
[(J #t #f)])
|
||||||
|
|
||||||
|
(test (with-handlers ([exn:fail? exn-message])
|
||||||
|
(generate-term L0 #:satisfying (c any) +inf.0))
|
||||||
|
#rx".*generate-term:.*relation.*")
|
||||||
|
|
||||||
|
(test (with-handlers ([exn:fail? exn-message])
|
||||||
|
(generate-term L0 #:satisfying (f any_1) = any_2 +inf.0))
|
||||||
|
#rx".*generate-term:.*relation.*")
|
||||||
|
|
||||||
|
(test (with-handlers ([exn:fail? exn-message])
|
||||||
|
(generate-term L0 #:satisfying (J any_1 any_2) +inf.0))
|
||||||
|
#rx".*generate-term:.*relation.*"))
|
||||||
|
|
|
@ -1254,6 +1254,31 @@
|
||||||
(test (term (b 1)) #t)
|
(test (term (b 1)) #t)
|
||||||
(test (term (b 2)) #t)
|
(test (term (b 2)) #t)
|
||||||
(test (term (b 3)) #f))
|
(test (term (b 3)) #f))
|
||||||
|
|
||||||
|
(let ()
|
||||||
|
(define-relation empty-language
|
||||||
|
[(a any)])
|
||||||
|
(define-relation empty-language
|
||||||
|
[(b any)])
|
||||||
|
(define-relation empty-language
|
||||||
|
[(c any) (a (b any))])
|
||||||
|
|
||||||
|
(define-metafunction empty-language
|
||||||
|
[(f any)
|
||||||
|
(c any)])
|
||||||
|
|
||||||
|
(define-judgment-form empty-language
|
||||||
|
#:mode (J I O)
|
||||||
|
[(J any_1 (a any_1))])
|
||||||
|
|
||||||
|
(test (term (a 1)) #t)
|
||||||
|
(test (term (b 2)) #t)
|
||||||
|
(test (term (c 3)) #t)
|
||||||
|
(test (term (c (b (a x)))) #t)
|
||||||
|
(test (term (f q)) #t)
|
||||||
|
(test (judgment-holds (J Z #t)) #t)
|
||||||
|
(test (judgment-holds (J Z Z)) #f)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
(exec-syntax-error-tests "syn-err-tests/relation-definition.rktd")
|
(exec-syntax-error-tests "syn-err-tests/relation-definition.rktd")
|
||||||
|
|
Loading…
Reference in New Issue
Block a user