Recovered better elim syntax in sugar.rkt
This commit is contained in:
parent
9681fbd9e0
commit
f4d38dec51
|
@ -78,6 +78,18 @@ Like the @racket[define] provided by @racketmodname[cur/curnel/redex-lang], but
|
||||||
defining curried functions via @racket[lambda*].
|
defining curried functions via @racket[lambda*].
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@defform[(elim type motive-result-type e ...)]{
|
||||||
|
Like the @racket[elim] provided by @racketmodname[cur/curnel/redex-lang], but supports
|
||||||
|
automatically curries the remaining arguments @racket[e ...].
|
||||||
|
|
||||||
|
@examples[#:eval curnel-eval
|
||||||
|
(require cur/stdlib/bool)
|
||||||
|
(elim Bool Type (lambda (x : Bool) Bool)
|
||||||
|
false
|
||||||
|
true
|
||||||
|
true)]
|
||||||
|
}
|
||||||
|
|
||||||
@defform*[((define-type name type)
|
@defform*[((define-type name type)
|
||||||
(define-type (name (a : t) ...) body))]{
|
(define-type (name (a : t) ...) body))]{
|
||||||
Like @racket[define], but uses @racket[forall*] instead of @racket[lambda*].
|
Like @racket[define], but uses @racket[forall*] instead of @racket[lambda*].
|
||||||
|
|
|
@ -33,12 +33,12 @@
|
||||||
|
|
||||||
;; Credit to this function goes to Max
|
;; Credit to this function goes to Max
|
||||||
(define nat-equal?
|
(define nat-equal?
|
||||||
((elim Nat Type) (lambda (x : Nat) (-> Nat Bool))
|
(elim Nat Type (lambda (x : Nat) (-> Nat Bool))
|
||||||
((elim Nat Type) (lambda (x : Nat) Bool)
|
(elim Nat Type (lambda (x : Nat) Bool)
|
||||||
true
|
true
|
||||||
(lambda* (x : Nat) (ih-n2 : Bool) false))
|
(lambda* (x : Nat) (ih-n2 : Bool) false))
|
||||||
(lambda* (x : Nat) (ih : (-> Nat Bool))
|
(lambda* (x : Nat) (ih : (-> Nat Bool))
|
||||||
((elim Nat Type) (lambda (x : Nat) Bool)
|
(elim Nat Type (lambda (x : Nat) Bool)
|
||||||
false
|
false
|
||||||
(lambda* (x : Nat) (ih-bla : Bool)
|
(lambda* (x : Nat) (ih-bla : Bool)
|
||||||
(ih x))))))
|
(ih x))))))
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
lambda*
|
lambda*
|
||||||
#%app
|
#%app
|
||||||
define
|
define
|
||||||
|
elim
|
||||||
define-type
|
define-type
|
||||||
case
|
case
|
||||||
case*
|
case*
|
||||||
|
@ -18,6 +19,7 @@
|
||||||
|
|
||||||
(require
|
(require
|
||||||
(only-in "../cur.rkt"
|
(only-in "../cur.rkt"
|
||||||
|
[elim real-elim]
|
||||||
[#%app real-app]
|
[#%app real-app]
|
||||||
[define real-define]))
|
[define real-define]))
|
||||||
|
|
||||||
|
@ -67,6 +69,9 @@
|
||||||
[(define id body)
|
[(define id body)
|
||||||
#'(real-define id body)]))
|
#'(real-define id body)]))
|
||||||
|
|
||||||
|
(define-syntax-rule (elim t1 t2 e ...)
|
||||||
|
((real-elim t1 t2) e ...))
|
||||||
|
|
||||||
(begin-for-syntax
|
(begin-for-syntax
|
||||||
(define (rewrite-clause clause)
|
(define (rewrite-clause clause)
|
||||||
(syntax-case clause (: IH:)
|
(syntax-case clause (: IH:)
|
||||||
|
@ -88,13 +93,13 @@
|
||||||
(let* ([D (type-infer/syn #'e)]
|
(let* ([D (type-infer/syn #'e)]
|
||||||
[M (type-infer/syn (clause-body #'(clause* ...)))]
|
[M (type-infer/syn (clause-body #'(clause* ...)))]
|
||||||
[U (type-infer/syn M)])
|
[U (type-infer/syn M)])
|
||||||
#`((elim #,D #,U) (lambda (x : #,D) #,M) #,@(map rewrite-clause (syntax->list #'(clause* ...)))
|
#`(elim #,D #,U (lambda (x : #,D) #,M) #,@(map rewrite-clause (syntax->list #'(clause* ...)))
|
||||||
e))]))
|
e))]))
|
||||||
|
|
||||||
(define-syntax (case* syn)
|
(define-syntax (case* syn)
|
||||||
(syntax-case syn ()
|
(syntax-case syn ()
|
||||||
[(_ D U e (p ...) P clause* ...)
|
[(_ D U e (p ...) P clause* ...)
|
||||||
#`((elim D U) P #,@(map rewrite-clause (syntax->list #'(clause* ...))) p ... e)]))
|
#`(elim D U P #,@(map rewrite-clause (syntax->list #'(clause* ...))) p ... e)]))
|
||||||
|
|
||||||
(define-syntax-rule (define-theorem name prop)
|
(define-syntax-rule (define-theorem name prop)
|
||||||
(define name prop))
|
(define name prop))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user