aboutsummaryrefslogtreecommitdiff
path: root/src/Experiments/NewPipeline/arith_rewrite_head.out
diff options
context:
space:
mode:
authorGravatar Jason Gross <jagro@google.com>2018-07-24 17:19:27 -0400
committerGravatar Jason Gross <jgross@mit.edu>2018-07-24 20:34:11 -0400
commit152094f4d9d83e4a5689536e0cd68d4f006517e1 (patch)
treee4d088973257662f29b3576b70649da3cf620e29 /src/Experiments/NewPipeline/arith_rewrite_head.out
parentee334b4bff8450afbc580a410fe1225b51260e05 (diff)
Improve rewriter speed
Andres and I met today, and discovered that there's a source of non-linear complexity in the rewriter which is not type casts. In adding side-conditions to the rewrite rules (which are not discussed in the pattern-matching compilation paper), I represented them by allowing rewrite rules to fail. So, for example, # + x ~~> x (when # == 0) is represented as # + x ~~> if (# =? 0) then Some x else None In the case that a rewrite rule fails, we need to try all other rewrite rules that might still apply. However, doing this in the naive-CPS way leads to non-linear blowup, because wildcard rewrite rules get duplicated in the failure branches. (This is similar to the issue that `match x with "some string" => true | _ => false end%string` will generate a large number of "false" branches, and duplicate "false" across all of them, rather than having a single default case.) For example, if we had the rewrite rules # + # ~~> literal sum x + (-y) ~~> x - y (-x) + y ~~> y - x then the compiled code would look like fun x y => if x is a literal then if y is a literal then literal sum else if y is an opp then x - y else x + y else if y is an opp then x - y else if x is an opp then y - x else x + y where we actually want the code fun x y => if x is a literal then if y is a literal then return (literal sum); if y is an opp then return (x - y); if x is an opp then return (y - x); return (x + y) in the sequence+return monad. i.e., we want to not duplicate the "if y is an opp" code multiple times. I think the solution to this is to have the discrimination tree evaluator return an option, and to have the function that computes the discrimination tree not duplicate rewrite rules among different cases. Note that this leads to slightly inefficient matching sometimes: when two rules with the same structure are separated by a rule with a wildcard instead of structure, we will now try to match on the structure twice. It might be useful to be able to denote that some rewrite rules can be commuted. After | File Name | Before || Change | % Change ---------------------------------------------------------------------------------------------------------------------- 40m35.83s | Total | 30m00.99s || +10m34.84s | +35.24% ---------------------------------------------------------------------------------------------------------------------- 21m46.37s | Experiments/NewPipeline/SlowPrimeSynthesisExamples | 6m01.39s || +15m44.97s | +261.48% 6m37.40s | p384_32.c | 0m22.47s || +6m14.92s | +1668.58% 0m18.00s | Experiments/NewPipeline/Rewriter | 5m16.50s || -4m58.50s | -94.31% 0m30.49s | Experiments/NewPipeline/ExtractionHaskell/unsaturated_solinas | 1m54.20s || -1m23.71s | -73.30% 0m27.41s | Experiments/NewPipeline/ExtractionHaskell/saturated_solinas | 1m39.40s || -1m11.99s | -72.42% 0m47.78s | Experiments/NewPipeline/ExtractionHaskell/word_by_word_montgomery | 1m54.50s || -1m06.71s | -58.27% 0m40.28s | Experiments/NewPipeline/ExtractionOCaml/word_by_word_montgomery | 1m23.77s || -0m43.48s | -51.91% 0m15.21s | Experiments/NewPipeline/ExtractionOCaml/saturated_solinas | 0m55.86s || -0m40.64s | -72.77% 0m23.39s | Experiments/NewPipeline/ExtractionOCaml/unsaturated_solinas | 1m00.22s || -0m36.82s | -61.15% 0m21.85s | p256_32.c | 0m04.01s || +0m17.84s | +444.88% 0m20.97s | secp256k1_32.c | 0m03.26s || +0m17.71s | +543.25% 0m04.60s | Experiments/NewPipeline/ExtractionOCaml/saturated_solinas.ml | 0m20.33s || -0m15.72s | -77.37% 0m09.48s | Experiments/NewPipeline/ExtractionOCaml/word_by_word_montgomery.ml | 0m23.28s || -0m13.80s | -59.27% 1m33.63s | Experiments/NewPipeline/Toplevel2 | 1m45.56s || -0m11.93s | -11.30% 0m08.29s | Experiments/NewPipeline/ExtractionOCaml/unsaturated_solinas.ml | 0m18.64s || -0m10.35s | -55.52% 0m05.93s | Experiments/NewPipeline/ExtractionHaskell/word_by_word_montgomery.hs | 0m16.74s || -0m10.80s | -64.57% 0m32.41s | p521_64.c | 0m41.42s || -0m09.01s | -21.75% 0m04.93s | Experiments/NewPipeline/ExtractionHaskell/unsaturated_solinas.hs | 0m14.92s || -0m09.99s | -66.95% 0m04.40s | Experiments/NewPipeline/ExtractionHaskell/saturated_solinas.hs | 0m12.57s || -0m08.16s | -64.99% 0m08.52s | p224_32.c | 0m01.95s || +0m06.56s | +336.92% 0m13.99s | p384_64.c | 0m10.64s || +0m03.34s | +31.48% 4m07.13s | Experiments/NewPipeline/Toplevel1 | 4m05.83s || +0m01.29s | +0.52% 0m38.96s | p521_32.c | 0m40.09s || -0m01.13s | -2.81% 0m02.28s | p224_64.c | 0m01.66s || +0m00.61s | +37.34% 0m02.27s | curve25519_32.c | 0m01.98s || +0m00.29s | +14.64% 0m01.78s | p256_64.c | 0m01.65s || +0m00.13s | +7.87% 0m01.70s | secp256k1_64.c | 0m01.96s || -0m00.26s | -13.26% 0m01.65s | curve25519_64.c | 0m01.51s || +0m00.13s | +9.27% 0m01.37s | Experiments/NewPipeline/CLI | 0m01.26s || +0m00.11s | +8.73% 0m01.15s | Experiments/NewPipeline/StandaloneHaskellMain | 0m01.21s || -0m00.06s | -4.95% 0m01.14s | Experiments/NewPipeline/StandaloneOCamlMain | 0m01.16s || -0m00.02s | -1.72% 0m01.07s | Experiments/NewPipeline/CompilersTestCases | 0m01.05s || +0m00.02s | +1.90%
Diffstat (limited to 'src/Experiments/NewPipeline/arith_rewrite_head.out')
-rw-r--r--src/Experiments/NewPipeline/arith_rewrite_head.out19703
1 files changed, 4006 insertions, 15697 deletions
diff --git a/src/Experiments/NewPipeline/arith_rewrite_head.out b/src/Experiments/NewPipeline/arith_rewrite_head.out
index 23b5205d2..994eaa810 100644
--- a/src/Experiments/NewPipeline/arith_rewrite_head.out
+++ b/src/Experiments/NewPipeline/arith_rewrite_head.out
@@ -8,39 +8,57 @@ match idc in (ident t) return (Compile.value' true t) with
UnderLets.UnderLets base.type ident var
(defaults.expr (type.base t0)))
with
- | base.type.unit => fun v0 : unit => UnderLets.Base ##(v0)%expr
- | base.type.Z => fun v0 : Z => UnderLets.Base ##(v0)%expr
- | base.type.bool => fun v0 : bool => UnderLets.Base ##(v0)%expr
- | base.type.nat => fun v0 : nat => UnderLets.Base ##(v0)%expr
+ | base.type.unit =>
+ fun v0 : unit => llet default := UnderLets.Base ##(v0)%expr in
+ default
+ | base.type.Z =>
+ fun v0 : Z => llet default := UnderLets.Base ##(v0)%expr in
+ default
+ | base.type.bool =>
+ fun v0 : bool => llet default := UnderLets.Base ##(v0)%expr in
+ default
+ | base.type.nat =>
+ fun v0 : nat => llet default := UnderLets.Base ##(v0)%expr in
+ default
end v
| ident.Nat_succ =>
fun x : defaults.expr (type.base base.type.nat) =>
- UnderLets.Base (#(ident.Nat_succ)%expr @ x)%expr_pat
+ llet default := UnderLets.Base (#(ident.Nat_succ)%expr @ x)%expr_pat in
+ default
| ident.Nat_pred =>
fun x : defaults.expr (type.base base.type.nat) =>
- UnderLets.Base (#(ident.Nat_pred)%expr @ x)%expr_pat
+ llet default := UnderLets.Base (#(ident.Nat_pred)%expr @ x)%expr_pat in
+ default
| ident.Nat_max =>
fun x x0 : defaults.expr (type.base base.type.nat) =>
- UnderLets.Base (#(ident.Nat_max)%expr @ x @ x0)%expr_pat
+ llet default := UnderLets.Base (#(ident.Nat_max)%expr @ x @ x0)%expr_pat in
+ default
| ident.Nat_mul =>
fun x x0 : defaults.expr (type.base base.type.nat) =>
- UnderLets.Base (#(ident.Nat_mul)%expr @ x @ x0)%expr_pat
+ llet default := UnderLets.Base (#(ident.Nat_mul)%expr @ x @ x0)%expr_pat in
+ default
| ident.Nat_add =>
fun x x0 : defaults.expr (type.base base.type.nat) =>
- UnderLets.Base (#(ident.Nat_add)%expr @ x @ x0)%expr_pat
+ llet default := UnderLets.Base (#(ident.Nat_add)%expr @ x @ x0)%expr_pat in
+ default
| ident.Nat_sub =>
fun x x0 : defaults.expr (type.base base.type.nat) =>
- UnderLets.Base (#(ident.Nat_sub)%expr @ x @ x0)%expr_pat
-| @ident.nil t => UnderLets.Base []%expr_pat
+ llet default := UnderLets.Base (#(ident.Nat_sub)%expr @ x @ x0)%expr_pat in
+ default
+| @ident.nil t => llet default := UnderLets.Base []%expr_pat in
+ default
| @ident.cons t =>
fun (x : defaults.expr (type.base t))
(x0 : defaults.expr (type.base (base.type.list t))) =>
- UnderLets.Base (x :: x0)%expr_pat
+ llet default := UnderLets.Base (x :: x0)%expr_pat in
+ default
| @ident.pair A B =>
fun (x : defaults.expr (type.base A)) (x0 : defaults.expr (type.base B))
- => UnderLets.Base (x, x0)%expr_pat
+ => llet default := UnderLets.Base (x, x0)%expr_pat in
+ default
| @ident.fst A B =>
fun x : defaults.expr (type.base (A * B)%etype) =>
+ llet default := UnderLets.Base (#(ident.fst)%expr @ x)%expr_pat in
match x with
| @expr.App _ _ _ s _ (@expr.App _ _ _ s0 _ #(idc)%expr_pat x1) x0 =>
match
@@ -79,32 +97,30 @@ match idc in (ident t) return (Compile.value' true t) with
defaults.expr (type.base A)) =>
match a with
| Some x' => UnderLets.Base (x' v)
- | None =>
- UnderLets.Base (#(ident.fst)%expr @ x)%expr_pat
+ | None => default
end)
| (s1 -> d1)%ptype =>
fun _ : Compile.value' false s1 -> Compile.value' true d1
- => UnderLets.Base (#(ident.fst)%expr @ x)%expr_pat
+ => default
end (Compile.reflect x0)
| (s1 -> d1)%ptype =>
fun _ : Compile.value' false s1 -> Compile.value' true d1 =>
- UnderLets.Base (#(ident.fst)%expr @ x)%expr_pat
+ default
end (Compile.reflect x1)
- | None => UnderLets.Base (#(ident.fst)%expr @ x)%expr_pat
+ | None => default
end
| @expr.App _ _ _ s _ (@expr.App _ _ _ s0 _ ($_)%expr _) _ | @expr.App _
_ _ s _ (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _) _ | @expr.App
_ _ _ s _ (@expr.App _ _ _ s0 _ (_ @ _)%expr_pat _) _ | @expr.App _ _ _
- s _ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _) _ =>
- UnderLets.Base (#(ident.fst)%expr @ x)%expr_pat
+ s _ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _) _ => default
| @expr.App _ _ _ s _ #(_)%expr_pat _ | @expr.App _ _ _ s _ ($_)%expr _ |
@expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.Base (#(ident.fst)%expr @ x)%expr_pat
- | _ => UnderLets.Base (#(ident.fst)%expr @ x)%expr_pat
+ (@expr.LetIn _ _ _ _ _ _ _) _ => default
+ | _ => default
end
| @ident.snd A B =>
fun x : defaults.expr (type.base (A * B)%etype) =>
+ llet default := UnderLets.Base (#(ident.snd)%expr @ x)%expr_pat in
match x with
| @expr.App _ _ _ s _ (@expr.App _ _ _ s0 _ #(idc)%expr_pat x1) x0 =>
match
@@ -143,29 +159,26 @@ match idc in (ident t) return (Compile.value' true t) with
defaults.expr (type.base B)) =>
match a with
| Some x' => UnderLets.Base (x' v0)
- | None =>
- UnderLets.Base (#(ident.snd)%expr @ x)%expr_pat
+ | None => default
end)
| (s1 -> d1)%ptype =>
fun _ : Compile.value' false s1 -> Compile.value' true d1
- => UnderLets.Base (#(ident.snd)%expr @ x)%expr_pat
+ => default
end (Compile.reflect x0)
| (s1 -> d1)%ptype =>
fun _ : Compile.value' false s1 -> Compile.value' true d1 =>
- UnderLets.Base (#(ident.snd)%expr @ x)%expr_pat
+ default
end (Compile.reflect x1)
- | None => UnderLets.Base (#(ident.snd)%expr @ x)%expr_pat
+ | None => default
end
| @expr.App _ _ _ s _ (@expr.App _ _ _ s0 _ ($_)%expr _) _ | @expr.App _
_ _ s _ (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _) _ | @expr.App
_ _ _ s _ (@expr.App _ _ _ s0 _ (_ @ _)%expr_pat _) _ | @expr.App _ _ _
- s _ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _) _ =>
- UnderLets.Base (#(ident.snd)%expr @ x)%expr_pat
+ s _ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _) _ => default
| @expr.App _ _ _ s _ #(_)%expr_pat _ | @expr.App _ _ _ s _ ($_)%expr _ |
@expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.Base (#(ident.snd)%expr @ x)%expr_pat
- | _ => UnderLets.Base (#(ident.snd)%expr @ x)%expr_pat
+ (@expr.LetIn _ _ _ _ _ _ _) _ => default
+ | _ => default
end
| @ident.prod_rect A B T =>
fun
@@ -174,10 +187,11 @@ match idc in (ident t) return (Compile.value' true t) with
UnderLets.UnderLets base.type ident var
(defaults.expr (type.base T)))
(x0 : defaults.expr (type.base (A * B)%etype)) =>
- UnderLets.Base
- (#(ident.prod_rect)%expr @
- (λ (x1 : var (type.base A))(x2 : var (type.base B)),
- UnderLets.to_expr (x ($x1) ($x2)))%expr @ x0)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.prod_rect)%expr @
+ (λ (x1 : var (type.base A))(x2 : var (type.base B)),
+ UnderLets.to_expr (x ($x1) ($x2)))%expr @ x0)%expr_pat in
+ default
| @ident.bool_rect T =>
fun
(x
@@ -185,12 +199,13 @@ match idc in (ident t) return (Compile.value' true t) with
UnderLets.UnderLets base.type ident var
(defaults.expr (type.base T)))
(x1 : defaults.expr (type.base base.type.bool)) =>
- UnderLets.Base
- (#(ident.bool_rect)%expr @
- (λ x2 : var (type.base base.type.unit),
- UnderLets.to_expr (x ($x2)))%expr @
- (λ x2 : var (type.base base.type.unit),
- UnderLets.to_expr (x0 ($x2)))%expr @ x1)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.bool_rect)%expr @
+ (λ x2 : var (type.base base.type.unit),
+ UnderLets.to_expr (x ($x2)))%expr @
+ (λ x2 : var (type.base base.type.unit),
+ UnderLets.to_expr (x0 ($x2)))%expr @ x1)%expr_pat in
+ default
| @ident.nat_rect P =>
fun
(x : defaults.expr (type.base base.type.unit) ->
@@ -201,12 +216,15 @@ match idc in (ident t) return (Compile.value' true t) with
UnderLets.UnderLets base.type ident var
(defaults.expr (type.base P)))
(x1 : defaults.expr (type.base base.type.nat)) =>
- UnderLets.Base
- (#(ident.nat_rect)%expr @
- (λ x2 : var (type.base base.type.unit),
- UnderLets.to_expr (x ($x2)))%expr @
- (λ (x2 : var (type.base base.type.nat))(x3 : var (type.base P)),
- UnderLets.to_expr (x0 ($x2) ($x3)))%expr @ x1)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.nat_rect)%expr @
+ (λ x2 : var (type.base base.type.unit),
+ UnderLets.to_expr (x ($x2)))%expr @
+ (λ (x2 : var (type.base base.type.nat))(x3 : var
+ (type.base
+ P)),
+ UnderLets.to_expr (x0 ($x2) ($x3)))%expr @ x1)%expr_pat in
+ default
| @ident.nat_rect_arrow P Q =>
fun
(x : defaults.expr (type.base P) ->
@@ -221,18 +239,22 @@ match idc in (ident t) return (Compile.value' true t) with
(defaults.expr (type.base Q)))
(x1 : defaults.expr (type.base base.type.nat))
(x2 : defaults.expr (type.base P)) =>
- UnderLets.Base
- (#(ident.nat_rect_arrow)%expr @
- (λ x3 : var (type.base P),
- UnderLets.to_expr (x ($x3)))%expr @
- (λ (x3 : var (type.base base.type.nat))(x4 : var
- (type.base P ->
- type.base Q)%ptype)
- (x5 : var (type.base P)),
- UnderLets.to_expr
- (x0 ($x3)
- (fun x6 : defaults.expr (type.base P) =>
- UnderLets.Base ($x4 @ x6)%expr_pat) ($x5)))%expr @ x1 @ x2)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.nat_rect_arrow)%expr @
+ (λ x3 : var (type.base P),
+ UnderLets.to_expr (x ($x3)))%expr @
+ (λ (x3 : var (type.base base.type.nat))(x4 : var
+ (type.base
+ P ->
+ type.base
+ Q)%ptype)
+ (x5 : var (type.base P)),
+ UnderLets.to_expr
+ (x0 ($x3)
+ (fun x6 : defaults.expr (type.base P) =>
+ UnderLets.Base ($x4 @ x6)%expr_pat) ($x5)))%expr @
+ x1 @ x2)%expr_pat in
+ default
| @ident.list_rect A P =>
fun
(x : defaults.expr (type.base base.type.unit) ->
@@ -244,13 +266,19 @@ match idc in (ident t) return (Compile.value' true t) with
UnderLets.UnderLets base.type ident var
(defaults.expr (type.base P)))
(x1 : defaults.expr (type.base (base.type.list A))) =>
- UnderLets.Base
- (#(ident.list_rect)%expr @
- (λ x2 : var (type.base base.type.unit),
- UnderLets.to_expr (x ($x2)))%expr @
- (λ (x2 : var (type.base A))(x3 : var (type.base (base.type.list A)))
- (x4 : var (type.base P)),
- UnderLets.to_expr (x0 ($x2) ($x3) ($x4)))%expr @ x1)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.list_rect)%expr @
+ (λ x2 : var (type.base base.type.unit),
+ UnderLets.to_expr (x ($x2)))%expr @
+ (λ (x2 : var (type.base A))(x3 : var
+ (type.base
+ (base.type.list
+ A)))(x4 :
+ var
+ (type.base
+ P)),
+ UnderLets.to_expr (x0 ($x2) ($x3) ($x4)))%expr @ x1)%expr_pat in
+ default
| @ident.list_case A P =>
fun
(x : defaults.expr (type.base base.type.unit) ->
@@ -261,70 +289,89 @@ match idc in (ident t) return (Compile.value' true t) with
UnderLets.UnderLets base.type ident var
(defaults.expr (type.base P)))
(x1 : defaults.expr (type.base (base.type.list A))) =>
- UnderLets.Base
- (#(ident.list_case)%expr @
- (λ x2 : var (type.base base.type.unit),
- UnderLets.to_expr (x ($x2)))%expr @
- (λ (x2 : var (type.base A))(x3 : var (type.base (base.type.list A))),
- UnderLets.to_expr (x0 ($x2) ($x3)))%expr @ x1)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.list_case)%expr @
+ (λ x2 : var (type.base base.type.unit),
+ UnderLets.to_expr (x ($x2)))%expr @
+ (λ (x2 : var (type.base A))(x3 : var
+ (type.base
+ (base.type.list
+ A))),
+ UnderLets.to_expr (x0 ($x2) ($x3)))%expr @ x1)%expr_pat in
+ default
| @ident.List_length T =>
fun x : defaults.expr (type.base (base.type.list T)) =>
- UnderLets.Base (#(ident.List_length)%expr @ x)%expr_pat
+ llet default := UnderLets.Base (#(ident.List_length)%expr @ x)%expr_pat in
+ default
| ident.List_seq =>
fun x x0 : defaults.expr (type.base base.type.nat) =>
- UnderLets.Base (#(ident.List_seq)%expr @ x @ x0)%expr_pat
+ llet default := UnderLets.Base (#(ident.List_seq)%expr @ x @ x0)%expr_pat in
+ default
| @ident.List_firstn A =>
fun (x : defaults.expr (type.base base.type.nat))
(x0 : defaults.expr (type.base (base.type.list A))) =>
- UnderLets.Base (#(ident.List_firstn)%expr @ x @ x0)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.List_firstn)%expr @ x @ x0)%expr_pat in
+ default
| @ident.List_skipn A =>
fun (x : defaults.expr (type.base base.type.nat))
(x0 : defaults.expr (type.base (base.type.list A))) =>
- UnderLets.Base (#(ident.List_skipn)%expr @ x @ x0)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.List_skipn)%expr @ x @ x0)%expr_pat in
+ default
| @ident.List_repeat A =>
fun (x : defaults.expr (type.base A))
(x0 : defaults.expr (type.base base.type.nat)) =>
- UnderLets.Base (#(ident.List_repeat)%expr @ x @ x0)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.List_repeat)%expr @ x @ x0)%expr_pat in
+ default
| @ident.List_combine A B =>
fun (x : defaults.expr (type.base (base.type.list A)))
(x0 : defaults.expr (type.base (base.type.list B))) =>
- UnderLets.Base (#(ident.List_combine)%expr @ x @ x0)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.List_combine)%expr @ x @ x0)%expr_pat in
+ default
| @ident.List_map A B =>
fun
(x : defaults.expr (type.base A) ->
UnderLets.UnderLets base.type ident var
(defaults.expr (type.base B)))
(x0 : defaults.expr (type.base (base.type.list A))) =>
- UnderLets.Base
- (#(ident.List_map)%expr @
- (λ x1 : var (type.base A),
- UnderLets.to_expr (x ($x1)))%expr @ x0)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.List_map)%expr @
+ (λ x1 : var (type.base A),
+ UnderLets.to_expr (x ($x1)))%expr @ x0)%expr_pat in
+ default
| @ident.List_app A =>
fun x x0 : defaults.expr (type.base (base.type.list A)) =>
- UnderLets.Base (x ++ x0)%expr
+ llet default := UnderLets.Base (x ++ x0)%expr in
+ default
| @ident.List_rev A =>
fun x : defaults.expr (type.base (base.type.list A)) =>
- UnderLets.Base (#(ident.List_rev)%expr @ x)%expr_pat
+ llet default := UnderLets.Base (#(ident.List_rev)%expr @ x)%expr_pat in
+ default
| @ident.List_flat_map A B =>
fun
(x : defaults.expr (type.base A) ->
UnderLets.UnderLets base.type ident var
(defaults.expr (type.base (base.type.list B))))
(x0 : defaults.expr (type.base (base.type.list A))) =>
- UnderLets.Base
- (#(ident.List_flat_map)%expr @
- (λ x1 : var (type.base A),
- UnderLets.to_expr (x ($x1)))%expr @ x0)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.List_flat_map)%expr @
+ (λ x1 : var (type.base A),
+ UnderLets.to_expr (x ($x1)))%expr @ x0)%expr_pat in
+ default
| @ident.List_partition A =>
fun
(x : defaults.expr (type.base A) ->
UnderLets.UnderLets base.type ident var
(defaults.expr (type.base base.type.bool)))
(x0 : defaults.expr (type.base (base.type.list A))) =>
- UnderLets.Base
- (#(ident.List_partition)%expr @
- (λ x1 : var (type.base A),
- UnderLets.to_expr (x ($x1)))%expr @ x0)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.List_partition)%expr @
+ (λ x1 : var (type.base A),
+ UnderLets.to_expr (x ($x1)))%expr @ x0)%expr_pat in
+ default
| @ident.List_fold_right A B =>
fun
(x : defaults.expr (type.base B) ->
@@ -333,511 +380,413 @@ match idc in (ident t) return (Compile.value' true t) with
(defaults.expr (type.base A)))
(x0 : defaults.expr (type.base A))
(x1 : defaults.expr (type.base (base.type.list B))) =>
- UnderLets.Base
- (#(ident.List_fold_right)%expr @
- (λ (x2 : var (type.base B))(x3 : var (type.base A)),
- UnderLets.to_expr (x ($x2) ($x3)))%expr @ x0 @ x1)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.List_fold_right)%expr @
+ (λ (x2 : var (type.base B))(x3 : var (type.base A)),
+ UnderLets.to_expr (x ($x2) ($x3)))%expr @ x0 @ x1)%expr_pat in
+ default
| @ident.List_update_nth T =>
fun (x : defaults.expr (type.base base.type.nat))
(x0 : defaults.expr (type.base T) ->
UnderLets.UnderLets base.type ident var
(defaults.expr (type.base T)))
(x1 : defaults.expr (type.base (base.type.list T))) =>
- UnderLets.Base
- (#(ident.List_update_nth)%expr @ x @
- (λ x2 : var (type.base T),
- UnderLets.to_expr (x0 ($x2)))%expr @ x1)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.List_update_nth)%expr @ x @
+ (λ x2 : var (type.base T),
+ UnderLets.to_expr (x0 ($x2)))%expr @ x1)%expr_pat in
+ default
| @ident.List_nth_default T =>
fun (x : defaults.expr (type.base T))
(x0 : defaults.expr (type.base (base.type.list T)))
(x1 : defaults.expr (type.base base.type.nat)) =>
- UnderLets.Base (#(ident.List_nth_default)%expr @ x @ x0 @ x1)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.List_nth_default)%expr @ x @ x0 @ x1)%expr_pat in
+ default
| ident.Z_add =>
fun x x0 : defaults.expr (type.base base.type.Z) =>
- match x with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match t0 as t1 return (base.base_interp t1 -> option Z) with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base x0
- else
- match x0 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if args0 =? 0
- then UnderLets.Base x
- else UnderLets.Base (x + x0)%expr
- | None => UnderLets.Base (x + x0)%expr
- end
- | @expr.App _ _ _ s _ #(idc0)%expr_pat x1 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args >? 0
- then UnderLets.Base (##(args) - x' v)%expr
- else
- match
- s as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base base.type.Z)))
- with
- | type.base t3 =>
- fun v0 : defaults.expr (type.base t3) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base base.type.Z)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if args <? 0
- then
- UnderLets.Base
- (- (##((- args)%Z) + x'0 v0))%expr
- else
- match
- s as t4
- return
- (Compile.value' false t4 ->
- UnderLets.UnderLets
- base.type ident var
- (defaults.expr
- (type.base base.type.Z)))
- with
- | type.base t4 =>
- fun
- v1 : defaults.expr
- (type.base t4) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr
- (type.base t1)) t4
- base.type.Z
- (UnderLets.UnderLets
- base.type ident var
- (defaults.expr
- (type.base
- base.type.Z)))
- (fun
- a1 : option
+ llet default := UnderLets.Base (x + x0)%expr in
+ llet default0 := fun 'tt =>
+ llet default0 := fun 'tt =>
+ llet default0 := fun 'tt =>
+ match x0 with
+ | @expr.App _ _ _ s _
+ #(idc)%expr_pat
+ x1 =>
+ match
+ match idc with
+ | ident.Z_opp =>
+ Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match
+ s as t2
+ return
+ (Compile.value'
+ false t2 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t2 =>
+ fun
+ v :
+ defaults.expr
+ (type.base
+ t2) =>
+ base.try_make_transport_cps
+ (fun
+ t0 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t0)) t2
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a :
+ option
+ (defaults.expr
+ (type.base
+ t2) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a
+ with
+ | Some
+ x' =>
+ UnderLets.Base
+ (x - x' v)%expr
+ | None =>
+ default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s0 ->
+ Compile.value'
+ true d0
+ => default
+ end
+ (Compile.reflect
+ x1)
+ | None => default
+ end
+ | @expr.App _ _ _ s _
+ ($_)%expr _ |
+ @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _
+ _) _ | @expr.App _
+ _ _ s _
+ (_ @ _)%expr_pat _ |
+ @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _
+ _ _ _) _ => default
+ | _ => default
+ end in
+ match x with
+ | @expr.App _ _ _ s _ #(idc)%expr_pat
+ x1 =>
+ match
+ match idc with
+ | ident.Z_opp => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match
+ s as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t2 =>
+ fun
+ v : defaults.expr
+ (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t0 : base.type =>
+ defaults.expr
+ (type.base t0)) t2
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
(defaults.expr
- (type.base t4) ->
+ (type.base t2) ->
defaults.expr
(type.base
base.type.Z))
- =>
- match a1 with
- | Some x'1 =>
- UnderLets.Base
- (x - x'1 v1)%expr
- | None =>
- UnderLets.Base
- (x + x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false
- s0 ->
- Compile.value' true d0
- =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None =>
- UnderLets.Base (x + x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x + x0)%expr
- end
- | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
- (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
- (@expr.LetIn _ _ _ _ _ _ _) _ => UnderLets.Base (x + x0)%expr
- | _ => UnderLets.Base (x + x0)%expr
- end
- | None =>
- match x0 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base x
- else UnderLets.Base (x + x0)%expr
- | None => UnderLets.Base (x + x0)%expr
- end
- | @expr.App _ _ _ s _ #(idc0)%expr_pat x1 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x - x' v)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x + x0)%expr
- end
- | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
- (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
- (@expr.LetIn _ _ _ _ _ _ _) _ => UnderLets.Base (x + x0)%expr
- | _ => UnderLets.Base (x + x0)%expr
- end
- end
- | ($_)%expr =>
- match x0 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t1 v0 =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base x
- else UnderLets.Base (x + x0)%expr
- | None => UnderLets.Base (x + x0)%expr
- end
- | @expr.App _ _ _ s _ #(idc)%expr_pat x1 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x - x' v0)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun _ : Compile.value' false s0 -> Compile.value' true d0
- => UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x + x0)%expr
- end
- | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.Base (x + x0)%expr
- | _ => UnderLets.Base (x + x0)%expr
- end
- | @expr.Abs _ _ _ _ _ _ =>
- match x0 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base x
- else UnderLets.Base (x + x0)%expr
- | None => UnderLets.Base (x + x0)%expr
- end
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x1 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x - x' v)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d1
- => UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x + x0)%expr
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _ _ _ s0 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.Base (x + x0)%expr
- | _ => UnderLets.Base (x + x0)%expr
- end
- | @expr.App _ _ _ s _ f x1 =>
- match x0 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base x
- else
- match f with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
+ =>
+ match a with
+ | Some x' =>
+ UnderLets.Base
+ (x0 - x' v)%expr
+ | None => default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ : Compile.value' false
+ s0 ->
+ Compile.value' true
+ d0 => default
+ end (Compile.reflect x1)
+ | None => default
+ end
+ | @expr.App _ _ _ s _ ($_)%expr _ |
+ @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
+ _ _ _ s _ (_ @ _)%expr_pat _ |
+ @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _ _ _ _) _ =>
+ default
+ | _ => default0 tt
+ end in
+ match x0 with
+ | #(idc)%expr_pat =>
match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
+ match idc with
+ | @ident.Literal t0 v =>
+ match
+ t0 as t1
+ return (base.base_interp t1 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr
- (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args >? 0
- then
- UnderLets.Base (##(args) - x' v)%expr
- else
+ | Some args =>
+ if args =? 0
+ then UnderLets.Base x
+ else
+ match x with
+ | @expr.App _ _ _ s _ #(idc0)%expr_pat x1 =>
+ match
+ match idc0 with
+ | ident.Z_opp => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match
+ s as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun
+ v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t1 : base.type =>
+ defaults.expr (type.base t1)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args >? 0
+ then
+ UnderLets.Base
+ (##(args) - x' v)%expr
+ else
+ match
+ s as t3
+ return
+ (Compile.value' false
+ t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t1 : base.type
+ =>
+ defaults.expr
+ (type.base t1)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if args <? 0
+ then
+ UnderLets.Base
+ (-
+ (x'0 v0 +
+ ##((- args)%Z)))%expr
+ else default
+ | None => default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ : Compile.value'
+ false s0 ->
+ Compile.value'
+ true d0 =>
+ default
+ end (Compile.reflect x1)
+ | None => default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ : Compile.value' false s0 ->
+ Compile.value' true d0 =>
+ default
+ end (Compile.reflect x1)
+ | None => default
+ end
+ | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _
+ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
+ _ _ _ s _ (_ @ _)%expr_pat _ | @expr.App _ _
+ _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
+ default
+ | _ => default
+ end
+ | None => default0 tt
+ end
+ | @expr.App _ _ _ s _ #(idc)%expr_pat x1 =>
+ match
+ match idc with
+ | ident.Z_opp => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x with
+ | #(idc0)%expr_pat =>
+ match
+ match idc0 with
+ | @ident.Literal t1 v =>
+ match
+ t1 as t2
+ return
+ (base.base_interp t2 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args0 =>
match
- s as t3
+ s as t2
return
- (Compile.value' false t3 ->
+ (Compile.value' false t2 ->
UnderLets.UnderLets base.type ident
var
(defaults.expr
(type.base base.type.Z)))
with
- | type.base t3 =>
- fun
- v0 : defaults.expr (type.base t3)
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
=>
base.try_make_transport_cps
(fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
+ defaults.expr (type.base t1)) t2
base.type.Z
(UnderLets.UnderLets base.type
ident var
(defaults.expr
(type.base base.type.Z)))
(fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base
- base.type.Z)) =>
- match a0 with
- | Some x'0 =>
- if args <? 0
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args0 >? 0
then
UnderLets.Base
- (-
- (x'0 v0 + ##((- args)%Z)))%expr
+ (##(args0) - x' v)%expr
else
match
- s as t4
+ s as t3
return
- (Compile.value' false t4 ->
+ (Compile.value' false t3 ->
UnderLets.UnderLets
base.type ident var
(defaults.expr
(type.base
base.type.Z)))
with
- | type.base t4 =>
+ | type.base t3 =>
fun
- v1 : defaults.expr
- (type.base t4)
+ v0 : defaults.expr
+ (type.base t3)
=>
base.try_make_transport_cps
(fun t1 : base.type =>
defaults.expr
- (type.base t1)) t4
+ (type.base t1)) t3
base.type.Z
(UnderLets.UnderLets
base.type ident var
@@ -845,21 +794,24 @@ match idc in (ident t) return (Compile.value' true t) with
(type.base
base.type.Z)))
(fun
- a1 : option
+ a0 : option
(defaults.expr
(type.base
- t4) ->
+ t3) ->
defaults.expr
(type.base
base.type.Z))
=>
- match a1 with
- | Some x'1 =>
- UnderLets.Base
- (x0 - x'1 v1)%expr
- | None =>
- UnderLets.Base
- (x + x0)%expr
+ match a0 with
+ | Some x'0 =>
+ if args0 <? 0
+ then
+ UnderLets.Base
+ (-
+ (##((- args0)%Z) +
+ x'0 v0))%expr
+ else default
+ | None => default
end)
| (s0 -> d0)%ptype =>
fun
@@ -867,645 +819,128 @@ match idc in (ident t) return (Compile.value' true t) with
false s0 ->
Compile.value'
true d0 =>
- UnderLets.Base
- (x + x0)%expr
+ default
end (Compile.reflect x1)
- | None =>
- UnderLets.Base (x + x0)%expr
+ | None => default
end)
| (s0 -> d0)%ptype =>
fun
_ : Compile.value' false s0 ->
Compile.value' true d0 =>
- UnderLets.Base (x + x0)%expr
+ default
end (Compile.reflect x1)
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x + x0)%expr
- end
- | _ => UnderLets.Base (x + x0)%expr
- end
- | None =>
- match f with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' => UnderLets.Base (x0 - x' v)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x + x0)%expr
- end
- | _ => UnderLets.Base (x + x0)%expr
- end
- end
- | ($_)%expr =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x0 - x' v0)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x + x0)%expr
- end
- | _ => UnderLets.Base (x + x0)%expr
- end
- | @expr.Abs _ _ _ _ _ _ =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x0 - x' v)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x + x0)%expr
- end
- | _ => UnderLets.Base (x + x0)%expr
- end
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x2 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match f with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- match
- s0 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base base.type.Z)))
- with
- | type.base t3 =>
- fun v0 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type ident
+ | None => default
+ end
+ | @expr.App _ _ _ s0 _ #(idc0)%expr_pat x2 =>
+ match
+ match idc0 with
+ | ident.Z_opp => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
var
(defaults.expr
(type.base base.type.Z)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- UnderLets.Base
- (- (x' v + x'0 v0))%expr
- | None =>
- UnderLets.Base (x + x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x2)
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' => UnderLets.Base (x - x' v)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x2)
- end
- | ($_)%expr =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x - x' v0)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x2)
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x - x' v)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x2)
- | _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x - x' v)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x2)
- end
- | None =>
- match f with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' => UnderLets.Base (x0 - x' v)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x + x0)%expr
- end
- | _ => UnderLets.Base (x + x0)%expr
- end
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x0 - x' v0)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x + x0)%expr
- end
- | _ => UnderLets.Base (x + x0)%expr
- end
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0
- _ (_ @ _)%expr_pat _ =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x0 - x' v)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x + x0)%expr
- end
- | _ => UnderLets.Base (x + x0)%expr
- end
- | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x0 - x' v)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x + x0)%expr
- end
- | _ => UnderLets.Base (x + x0)%expr
- end
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x0 - x' v)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x + x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x + x0)%expr
- end
- | _ => UnderLets.Base (x + x0)%expr
- end
- end
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match x0 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base x
- else UnderLets.Base (x + x0)%expr
- | None => UnderLets.Base (x + x0)%expr
- end
- | @expr.App _ _ _ s _ #(idc)%expr_pat x2 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x - x' v)%expr
- | None => UnderLets.Base (x + x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun _ : Compile.value' false s0 -> Compile.value' true d0
- => UnderLets.Base (x + x0)%expr
- end (Compile.reflect x2)
- | None => UnderLets.Base (x + x0)%expr
- end
- | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.Base (x + x0)%expr
- | _ => UnderLets.Base (x + x0)%expr
- end
- end
-| ident.Z_mul =>
- fun x x0 : defaults.expr (type.base base.type.Z) =>
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t1 : base.type =>
+ defaults.expr (type.base t1)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t1 : base.type =>
+ defaults.expr
+ (type.base t1)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ UnderLets.Base
+ (-
+ (x' v + x'0 v0))%expr
+ | None => default
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 => default
+ end (Compile.reflect x1)
+ | None => default
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ default
+ end (Compile.reflect x2)
+ | None => default
+ end
+ | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _
+ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
+ _ _ _ s0 _ (_ @ _)%expr_pat _ | @expr.App _ _
+ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
+ default
+ | _ => default
+ end
+ | None => default
+ end
+ | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
+ (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _ _ _ _) _ => default
+ | _ => default0 tt
+ end in
match x with
| #(idc)%expr_pat =>
match
@@ -1520,1206 +955,1045 @@ match idc in (ident t) return (Compile.value' true t) with
| _ => None
end
with
- | Some args =>
- if args =? 0
- then UnderLets.Base ##(0)%expr
- else
- match x0 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if args0 =? 0
- then UnderLets.Base ##(0)%expr
- else
- if args =? 1
- then UnderLets.Base x0
- else
- if args0 =? 1
- then UnderLets.Base x
- else
- if args =? -1
- then UnderLets.Base (- x0)%expr
- else
- if args0 =? -1
- then UnderLets.Base (- x)%expr
- else
- if args <? 0
- then UnderLets.Base (- (##((- args)%Z) * x0))%expr
- else
- if args0 <? 0
- then UnderLets.Base (- (x * ##((- args0)%Z)))%expr
- else
- if
- (args0 =? 2 ^ Z.log2 args0) && negb (args0 =? 2)
- then UnderLets.Base (x << ##(Z.log2 args0))%expr
- else
- if (args =? 2 ^ Z.log2 args) && negb (args =? 2)
- then UnderLets.Base (x0 << ##(Z.log2 args))%expr
- else UnderLets.Base (x * x0)%expr
- | None =>
- if args =? 1
- then UnderLets.Base x0
- else
- if args =? -1
- then UnderLets.Base (- x0)%expr
- else
- if args <? 0
- then UnderLets.Base (- (##((- args)%Z) * x0))%expr
- else
- if (args =? 2 ^ Z.log2 args) && negb (args =? 2)
- then UnderLets.Base (x0 << ##(Z.log2 args))%expr
- else UnderLets.Base (x * x0)%expr
- end
- | @expr.App _ _ _ s _ f x1 =>
- if args =? 1
- then UnderLets.Base x0
- else
- match f with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr
- (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args =? -1
- then UnderLets.Base (x' v)
- else
- if args =? -1
- then UnderLets.Base (- x0)%expr
- else
- if args <? 0
- then
- UnderLets.Base
- (- (##((- args)%Z) * x0))%expr
- else
- match
- s as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base base.type.Z)))
- with
- | type.base t3 =>
- fun
- v0 : defaults.expr
- (type.base t3) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1))
- t3 base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base base.type.Z)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base
- base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- UnderLets.Base
- (- (x * x'0 v0))%expr
- | None =>
- UnderLets.Base
- (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None =>
- if args =? -1
- then UnderLets.Base (- x0)%expr
- else
- if args <? 0
- then UnderLets.Base (- (##((- args)%Z) * x0))%expr
- else
- if (args =? 2 ^ Z.log2 args) && negb (args =? 2)
- then UnderLets.Base (x0 << ##(Z.log2 args))%expr
- else UnderLets.Base (x * x0)%expr
- end
- | _ =>
- if args =? -1
- then UnderLets.Base (- x0)%expr
- else
- if args <? 0
- then UnderLets.Base (- (##((- args)%Z) * x0))%expr
- else
- if (args =? 2 ^ Z.log2 args) && negb (args =? 2)
- then UnderLets.Base (x0 << ##(Z.log2 args))%expr
- else UnderLets.Base (x * x0)%expr
- end
- | _ =>
- if args =? 1
- then UnderLets.Base x0
- else
- if args =? -1
- then UnderLets.Base (- x0)%expr
- else
- if args <? 0
- then UnderLets.Base (- (##((- args)%Z) * x0))%expr
- else
- if (args =? 2 ^ Z.log2 args) && negb (args =? 2)
- then UnderLets.Base (x0 << ##(Z.log2 args))%expr
- else UnderLets.Base (x * x0)%expr
- end
- | None =>
- match x0 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base ##(0)%expr
- else
- if args =? 1
- then UnderLets.Base x
- else
- if args =? -1
- then UnderLets.Base (- x)%expr
- else
- if args <? 0
- then UnderLets.Base (- (x * ##((- args)%Z)))%expr
- else
- if (args =? 2 ^ Z.log2 args) && negb (args =? 2)
- then UnderLets.Base (x << ##(Z.log2 args))%expr
- else UnderLets.Base (x * x0)%expr
- | None => UnderLets.Base (x * x0)%expr
- end
- | @expr.App _ _ _ s _ #(idc0)%expr_pat x1 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x * x' v))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
- end
- | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
- (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
- (@expr.LetIn _ _ _ _ _ _ _) _ => UnderLets.Base (x * x0)%expr
- | _ => UnderLets.Base (x * x0)%expr
- end
- end
- | ($_)%expr =>
- match x0 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t1 v0 =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base ##(0)%expr
- else
- if args =? 1
- then UnderLets.Base x
- else
- if args =? -1
- then UnderLets.Base (- x)%expr
- else
- if args <? 0
- then UnderLets.Base (- (x * ##((- args)%Z)))%expr
- else
- if (args =? 2 ^ Z.log2 args) && negb (args =? 2)
- then UnderLets.Base (x << ##(Z.log2 args))%expr
- else UnderLets.Base (x * x0)%expr
- | None => UnderLets.Base (x * x0)%expr
- end
- | @expr.App _ _ _ s _ #(idc)%expr_pat x1 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x * x' v0))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun _ : Compile.value' false s0 -> Compile.value' true d0
- => UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
- end
- | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.Base (x * x0)%expr
- | _ => UnderLets.Base (x * x0)%expr
- end
- | @expr.Abs _ _ _ _ _ _ =>
- match x0 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base ##(0)%expr
- else
- if args =? 1
- then UnderLets.Base x
- else
- if args =? -1
- then UnderLets.Base (- x)%expr
- else
- if args <? 0
- then UnderLets.Base (- (x * ##((- args)%Z)))%expr
- else
- if (args =? 2 ^ Z.log2 args) && negb (args =? 2)
- then UnderLets.Base (x << ##(Z.log2 args))%expr
- else UnderLets.Base (x * x0)%expr
- | None => UnderLets.Base (x * x0)%expr
- end
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x1 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x * x' v))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d1
- => UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _ _ _ s0 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.Base (x * x0)%expr
- | _ => UnderLets.Base (x * x0)%expr
- end
- | @expr.App _ _ _ s _ f x1 =>
- match x0 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base ##(0)%expr
- else
- if args =? 1
- then UnderLets.Base x
- else
- match f with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr
- (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args =? -1
- then UnderLets.Base (x' v)
- else
- if args =? -1
- then UnderLets.Base (- x)%expr
- else
- if args <? 0
- then
- UnderLets.Base
- (- (x * ##((- args)%Z)))%expr
- else
- match
- s as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base base.type.Z)))
- with
- | type.base t3 =>
- fun
- v0 : defaults.expr
- (type.base t3) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1))
- t3 base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base base.type.Z)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base
- base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- UnderLets.Base
- (- (x'0 v0 * x0))%expr
- | None =>
- UnderLets.Base
- (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None =>
- if args =? -1
- then UnderLets.Base (- x)%expr
- else
- if args <? 0
- then UnderLets.Base (- (x * ##((- args)%Z)))%expr
- else
- if (args =? 2 ^ Z.log2 args) && negb (args =? 2)
- then UnderLets.Base (x << ##(Z.log2 args))%expr
- else UnderLets.Base (x * x0)%expr
- end
- | _ =>
- if args =? -1
- then UnderLets.Base (- x)%expr
- else
- if args <? 0
- then UnderLets.Base (- (x * ##((- args)%Z)))%expr
- else
- if (args =? 2 ^ Z.log2 args) && negb (args =? 2)
- then UnderLets.Base (x << ##(Z.log2 args))%expr
- else UnderLets.Base (x * x0)%expr
- end
- | None =>
- match f with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- UnderLets.Base (- (x' v * x0))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
- end
- | _ => UnderLets.Base (x * x0)%expr
- end
- end
- | ($_)%expr =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x' v0 * x0))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
- end
- | _ => UnderLets.Base (x * x0)%expr
- end
- | @expr.Abs _ _ _ _ _ _ =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x' v * x0))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
- end
- | _ => UnderLets.Base (x * x0)%expr
- end
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x2 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match f with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- match
- s0 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base base.type.Z)))
- with
- | type.base t3 =>
- fun v0 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base base.type.Z)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- UnderLets.Base
- (x' v * x'0 v0)%expr
- | None =>
- UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x2)
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- UnderLets.Base (- (x * x' v))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x2)
- end
- | ($_)%expr =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x * x' v0))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x2)
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x * x' v))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x2)
- | _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x * x' v))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x2)
- end
- | None =>
- match f with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- UnderLets.Base (- (x' v * x0))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
- end
- | _ => UnderLets.Base (x * x0)%expr
- end
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x' v0 * x0))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
- end
- | _ => UnderLets.Base (x * x0)%expr
- end
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0
- _ (_ @ _)%expr_pat _ =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x' v * x0))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
- end
- | _ => UnderLets.Base (x * x0)%expr
- end
- | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x' v * x0))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
- end
- | _ => UnderLets.Base (x * x0)%expr
- end
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x' v * x0))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
- end
- | _ => UnderLets.Base (x * x0)%expr
- end
- end
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match x0 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base ##(0)%expr
- else
- if args =? 1
- then UnderLets.Base x
- else
- if args =? -1
- then UnderLets.Base (- x)%expr
- else
- if args <? 0
- then UnderLets.Base (- (x * ##((- args)%Z)))%expr
- else
- if (args =? 2 ^ Z.log2 args) && negb (args =? 2)
- then UnderLets.Base (x << ##(Z.log2 args))%expr
- else UnderLets.Base (x * x0)%expr
- | None => UnderLets.Base (x * x0)%expr
- end
- | @expr.App _ _ _ s _ #(idc)%expr_pat x2 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x * x' v))%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun _ : Compile.value' false s0 -> Compile.value' true d0
- => UnderLets.Base (x * x0)%expr
- end (Compile.reflect x2)
- | None => UnderLets.Base (x * x0)%expr
- end
- | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.Base (x * x0)%expr
- | _ => UnderLets.Base (x * x0)%expr
+ | Some args => if args =? 0 then UnderLets.Base x0 else default
+ | None => default0 tt
end
+ | _ => default0 tt
end
-| ident.Z_pow =>
- fun x x0 : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_pow)%expr @ x @ x0)%expr_pat
-| ident.Z_sub =>
+| ident.Z_mul =>
fun x x0 : defaults.expr (type.base base.type.Z) =>
+ llet default := UnderLets.Base (x * x0)%expr in
+ llet default0 := fun 'tt =>
+ llet default0 := fun 'tt =>
+ llet default0 := fun 'tt =>
+ llet default0 :=
+ fun 'tt =>
+ llet default0 :=
+ fun 'tt =>
+ llet default0 :=
+ fun 'tt =>
+ llet default0 :=
+ fun 'tt =>
+ llet default0 :=
+ fun 'tt =>
+ llet default0 :=
+ fun 'tt =>
+ llet default0 :=
+ fun 'tt =>
+ match x with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal
+ t0 v =>
+ match
+ t0 as t1
+ return
+ (base.base_interp
+ t1 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if
+ (args =?
+ 2
+ ^ Z.log2
+ args) &&
+ negb
+ (args =? 2)
+ then
+ UnderLets.Base
+ (x0 <<
+ ##
+ (Z.log2
+ args))%expr
+ else default
+ | None => default
+ end
+ | _ => default
+ end in
+ match x0 with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal
+ t0 v =>
+ match
+ t0 as t1
+ return
+ (base.base_interp
+ t1 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if
+ (args =?
+ 2
+ ^ Z.log2
+ args) &&
+ negb
+ (args =? 2)
+ then
+ UnderLets.Base
+ (x <<
+ ##
+ (Z.log2
+ args))%expr
+ else default
+ | None =>
+ default0 tt
+ end
+ | @expr.App _ _ _ s _
+ #(idc)%expr_pat
+ x1 =>
+ match
+ match idc with
+ | ident.Z_opp =>
+ Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match
+ s as t2
+ return
+ (Compile.value'
+ false t2 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t2 =>
+ fun
+ v :
+ defaults.expr
+ (type.base
+ t2) =>
+ base.try_make_transport_cps
+ (fun
+ t0 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t0)) t2
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a :
+ option
+ (defaults.expr
+ (type.base
+ t2) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a
+ with
+ | Some
+ x' =>
+ UnderLets.Base
+ (-
+ (x * x' v))%expr
+ | None =>
+ default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s0 ->
+ Compile.value'
+ true d0
+ => default
+ end
+ (Compile.reflect
+ x1)
+ | None => default
+ end
+ | @expr.App _ _ _ s _
+ ($_)%expr _ |
+ @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _
+ _) _ | @expr.App _
+ _ _ s _
+ (_ @ _)%expr_pat _ |
+ @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _
+ _ _ _) _ => default
+ | _ => default0 tt
+ end in
+ match x with
+ | @expr.App _ _ _ s _
+ #(idc)%expr_pat
+ x1 =>
+ match
+ match idc with
+ | ident.Z_opp =>
+ Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match
+ s as t2
+ return
+ (Compile.value'
+ false t2 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t2 =>
+ fun
+ v :
+ defaults.expr
+ (type.base
+ t2) =>
+ base.try_make_transport_cps
+ (fun
+ t0 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t0)) t2
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a :
+ option
+ (defaults.expr
+ (type.base
+ t2) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a
+ with
+ | Some
+ x' =>
+ UnderLets.Base
+ (-
+ (x' v *
+ x0))%expr
+ | None =>
+ default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s0 ->
+ Compile.value'
+ true d0
+ => default
+ end
+ (Compile.reflect
+ x1)
+ | None => default
+ end
+ | @expr.App _ _ _ s _
+ ($_)%expr _ |
+ @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _
+ _) _ | @expr.App _
+ _ _ s _
+ (_ @ _)%expr_pat _ |
+ @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _
+ _ _ _) _ => default
+ | _ => default0 tt
+ end in
+ match x0 with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal
+ t0 v =>
+ match
+ t0 as t1
+ return
+ (base.base_interp
+ t1 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if args <? 0
+ then
+ UnderLets.Base
+ (-
+ (x *
+ ##
+ ((- args)%Z)))%expr
+ else default
+ | None =>
+ default0 tt
+ end
+ | @expr.App _ _ _ s _
+ #(idc)%expr_pat
+ x1 =>
+ match
+ match idc with
+ | ident.Z_opp =>
+ Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x with
+ | @expr.App _
+ _ _ s0 _
+ #(idc0)%expr_pat
+ x2 =>
+ match
+ match
+ idc0
+ with
+ | ident.Z_opp =>
+ Some tt
+ | _ =>
+ None
+ end
+ with
+ | Some
+ _ =>
+ match
+ s0 as t2
+ return
+ (Compile.value'
+ false t2 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t2 =>
+ fun
+ v :
+ defaults.expr
+ (type.base
+ t2) =>
+ base.try_make_transport_cps
+ (fun
+ t1 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t1)) t2
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a :
+ option
+ (defaults.expr
+ (type.base
+ t2) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a
+ with
+ | Some
+ x' =>
+ match
+ s as t3
+ return
+ (Compile.value'
+ false t3 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t3 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t3) =>
+ base.try_make_transport_cps
+ (fun
+ t1 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t1)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ UnderLets.Base
+ (x' v *
+ x'0 v0)%expr
+ | None =>
+ default
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ default
+ end
+ (Compile.reflect
+ x1)
+ | None =>
+ default
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ default
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ default
+ end
+ | @expr.App _
+ _ _ s0 _
+ ($_)%expr
+ _ |
+ @expr.App _
+ _ _ s0 _
+ (@expr.Abs _
+ _ _ _ _ _)
+ _ |
+ @expr.App _
+ _ _ s0 _
+ (_ @ _)%expr_pat
+ _ |
+ @expr.App _
+ _ _ s0 _
+ (@expr.LetIn
+ _ _ _ _ _ _
+ _) _ =>
+ default
+ | _ => default
+ end
+ | None => default
+ end
+ | @expr.App _ _ _ s _
+ ($_)%expr _ |
+ @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _
+ _) _ | @expr.App _
+ _ _ s _
+ (_ @ _)%expr_pat _ |
+ @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _
+ _ _ _) _ => default
+ | _ => default0 tt
+ end in
+ match x with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal
+ t0 v =>
+ match
+ t0 as t1
+ return
+ (base.base_interp
+ t1 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if args <? 0
+ then
+ UnderLets.Base
+ (-
+ (##
+ ((- args)%Z) *
+ x0))%expr
+ else default
+ | None =>
+ default0 tt
+ end
+ | _ => default0 tt
+ end in
+ match x0 with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal
+ t0 v =>
+ match
+ t0 as t1
+ return
+ (base.base_interp
+ t1 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if args =? -1
+ then
+ UnderLets.Base
+ (- x)%expr
+ else default
+ | None =>
+ default0 tt
+ end
+ | _ => default0 tt
+ end in
+ match x with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal
+ t0 v =>
+ match
+ t0 as t1
+ return
+ (base.base_interp
+ t1 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if args =? -1
+ then
+ UnderLets.Base
+ (- x0)%expr
+ else default
+ | None =>
+ default0 tt
+ end
+ | _ => default0 tt
+ end in
+ match x0 with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal
+ t0 v =>
+ match
+ t0 as t1
+ return
+ (base.base_interp
+ t1 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if args =? 1
+ then
+ UnderLets.Base
+ x
+ else
+ match x with
+ | @expr.App _
+ _ _ s _
+ #(idc0)%expr_pat
+ x1 =>
+ match
+ match
+ idc0
+ with
+ | ident.Z_opp =>
+ Some tt
+ | _ =>
+ None
+ end
+ with
+ | Some
+ _ =>
+ match
+ s as t2
+ return
+ (Compile.value'
+ false t2 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t2 =>
+ fun
+ v :
+ defaults.expr
+ (type.base
+ t2) =>
+ base.try_make_transport_cps
+ (fun
+ t1 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t1)) t2
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a :
+ option
+ (defaults.expr
+ (type.base
+ t2) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a
+ with
+ | Some
+ x' =>
+ if
+ args =?
+ -1
+ then
+ UnderLets.Base
+ (x' v)
+ else
+ default
+ | None =>
+ default
+ end)
+ | (s0 ->
+ d0)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s0 ->
+ Compile.value'
+ true d0
+ =>
+ default
+ end
+ (Compile.reflect
+ x1)
+ | None =>
+ default
+ end
+ | @expr.App _
+ _ _ s _
+ ($_)%expr
+ _ |
+ @expr.App _
+ _ _ s _
+ (@expr.Abs
+ _ _ _ _ _
+ _) _ |
+ @expr.App _
+ _ _ s _
+ (_ @ _)%expr_pat
+ _ |
+ @expr.App _
+ _ _ s _
+ (@expr.LetIn
+ _ _ _ _ _
+ _ _) _ =>
+ default
+ | _ =>
+ default
+ end
+ | None =>
+ default0 tt
+ end
+ | @expr.App _ _ _ s _
+ #(idc)%expr_pat
+ x1 =>
+ match
+ match idc with
+ | ident.Z_opp =>
+ Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x with
+ | #(idc0)%expr_pat =>
+ match
+ match
+ idc0
+ with
+ | @ident.Literal
+ t1 v =>
+ match
+ t1 as t2
+ return
+ (base.base_interp
+ t2 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args0 =>
+ match
+ s as t2
+ return
+ (Compile.value'
+ false t2 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t2 =>
+ fun
+ v :
+ defaults.expr
+ (type.base
+ t2) =>
+ base.try_make_transport_cps
+ (fun
+ t1 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t1)) t2
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a :
+ option
+ (defaults.expr
+ (type.base
+ t2) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a
+ with
+ | Some
+ x' =>
+ if
+ args0 =?
+ -1
+ then
+ UnderLets.Base
+ (x' v)
+ else
+ default
+ | None =>
+ default
+ end)
+ | (s0 ->
+ d0)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s0 ->
+ Compile.value'
+ true d0
+ =>
+ default
+ end
+ (Compile.reflect
+ x1)
+ | None =>
+ default
+ end
+ | _ => default
+ end
+ | None => default
+ end
+ | @expr.App _ _ _ s _
+ ($_)%expr _ |
+ @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _
+ _) _ | @expr.App _
+ _ _ s _
+ (_ @ _)%expr_pat _ |
+ @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _
+ _ _ _) _ => default
+ | _ => default0 tt
+ end in
+ match x with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal t0 v =>
+ match
+ t0 as t1
+ return
+ (base.base_interp t1 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if args =? 1
+ then UnderLets.Base x0
+ else default
+ | None => default0 tt
+ end
+ | _ => default0 tt
+ end in
+ match x0 with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal t0 v =>
+ match
+ t0 as t1
+ return (base.base_interp t1 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if args =? 0
+ then UnderLets.Base ##(0)%expr
+ else default
+ | None => default0 tt
+ end
+ | _ => default0 tt
+ end in
match x with
| #(idc)%expr_pat =>
match
@@ -2735,753 +2009,846 @@ match idc in (ident t) return (Compile.value' true t) with
end
with
| Some args =>
- match x0 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if args =? 0
- then UnderLets.Base (- x0)%expr
- else
- if args0 =? 0
- then UnderLets.Base x
- else
- if args <? 0
- then UnderLets.Base (- (##((- args)%Z) + x0))%expr
- else
- if args0 <? 0
- then UnderLets.Base (x + ##((- args0)%Z))%expr
- else UnderLets.Base (x - x0)%expr
- | None =>
- if args =? 0
- then UnderLets.Base (- x0)%expr
- else
- if args <? 0
- then UnderLets.Base (- (##((- args)%Z) + x0))%expr
- else UnderLets.Base (x - x0)%expr
- end
- | @expr.App _ _ _ s _ #(idc0)%expr_pat x1 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args =? 0
- then UnderLets.Base (x' v)
- else
- if args =? 0
- then UnderLets.Base (- x0)%expr
- else
- match
- s as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base base.type.Z)))
- with
- | type.base t3 =>
- fun v0 : defaults.expr (type.base t3) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base base.type.Z)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if args >? 0
- then
- UnderLets.Base
- (##(args) + x'0 v0)%expr
- else
- match
- s as t4
- return
- (Compile.value' false t4 ->
- UnderLets.UnderLets
- base.type ident var
- (defaults.expr
- (type.base base.type.Z)))
- with
- | type.base t4 =>
- fun
- v1 : defaults.expr
- (type.base t4) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr
- (type.base t1)) t4
- base.type.Z
- (UnderLets.UnderLets
- base.type ident var
- (defaults.expr
- (type.base
- base.type.Z)))
- (fun
- a1 : option
- (defaults.expr
- (type.base t4) ->
- defaults.expr
- (type.base
- base.type.Z))
- =>
- match a1 with
- | Some x'1 =>
- if args <? 0
- then
- UnderLets.Base
- (x'1 v1 -
- ##((- args)%Z))%expr
- else
- if args <? 0
- then
- UnderLets.Base
- (-
- (##((- args)%Z) +
- x0))%expr
- else
- match
- s as t5
- return
- (Compile.value'
- false t5 ->
- UnderLets.UnderLets
- base.type
- ident var
- (defaults.expr
+ if args =? 0 then UnderLets.Base ##(0)%expr else default
+ | None => default0 tt
+ end
+ | _ => default0 tt
+ end
+| ident.Z_pow =>
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
+ llet default := UnderLets.Base (#(ident.Z_pow)%expr @ x @ x0)%expr_pat in
+ default
+| ident.Z_sub =>
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
+ llet default := UnderLets.Base (x - x0)%expr in
+ llet default0 := fun 'tt =>
+ llet default0 := fun 'tt =>
+ llet default0 := fun 'tt =>
+ llet default0 :=
+ fun 'tt =>
+ llet default0 :=
+ fun 'tt =>
+ match x0 with
+ | @expr.App _ _ _ s _
+ #(idc)%expr_pat
+ x1 =>
+ match
+ match idc with
+ | ident.Z_opp =>
+ Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match
+ s as t2
+ return
+ (Compile.value'
+ false t2 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
(type.base
base.type.Z)))
- with
- | type.base t5 =>
- fun
- v2 :
- defaults.expr
- (type.base
- t5) =>
- base.try_make_transport_cps
- (fun
- t1 : base.type
- =>
- defaults.expr
- (type.base
- t1)) t5
- base.type.Z
- (UnderLets.UnderLets
- base.type
- ident var
- (defaults.expr
+ with
+ | type.base
+ t2 =>
+ fun
+ v :
+ defaults.expr
+ (type.base
+ t2) =>
+ base.try_make_transport_cps
+ (fun
+ t0 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t0)) t2
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a :
+ option
+ (defaults.expr
+ (type.base
+ t2) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a
+ with
+ | Some
+ x' =>
+ UnderLets.Base
+ (x + x' v)%expr
+ | None =>
+ default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s0 ->
+ Compile.value'
+ true d0
+ => default
+ end
+ (Compile.reflect
+ x1)
+ | None => default
+ end
+ | @expr.App _ _ _ s _
+ ($_)%expr _ |
+ @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _
+ _) _ | @expr.App _
+ _ _ s _
+ (_ @ _)%expr_pat _ |
+ @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _
+ _ _ _) _ => default
+ | _ => default
+ end in
+ match x with
+ | @expr.App _ _ _ s _
+ #(idc)%expr_pat
+ x1 =>
+ match
+ match idc with
+ | ident.Z_opp =>
+ Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match
+ s as t2
+ return
+ (Compile.value'
+ false t2 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t2 =>
+ fun
+ v :
+ defaults.expr
+ (type.base
+ t2) =>
+ base.try_make_transport_cps
+ (fun
+ t0 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t0)) t2
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
(type.base
base.type.Z)))
- (fun
- a2 :
+ (fun
+ a :
option
(defaults.expr
(type.base
- t5) ->
+ t2) ->
defaults.expr
(type.base
base.type.Z))
- =>
+ =>
+ match
+ a
+ with
+ | Some
+ x' =>
+ UnderLets.Base
+ (-
+ (x' v +
+ x0))%expr
+ | None =>
+ default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s0 ->
+ Compile.value'
+ true d0
+ => default
+ end
+ (Compile.reflect
+ x1)
+ | None => default
+ end
+ | @expr.App _ _ _ s _
+ ($_)%expr _ |
+ @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _
+ _) _ | @expr.App _
+ _ _ s _
+ (_ @ _)%expr_pat _ |
+ @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _
+ _ _ _) _ => default
+ | _ => default0 tt
+ end in
+ match x0 with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal
+ t0 v =>
match
- a2
+ t0 as t1
+ return
+ (base.base_interp
+ t1 ->
+ option Z)
with
- | Some
- x'2 =>
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if args <? 0
+ then
+ UnderLets.Base
+ (x +
+ ##
+ ((- args)%Z))%expr
+ else default
+ | None =>
+ default0 tt
+ end
+ | @expr.App _ _ _ s _
+ #(idc)%expr_pat
+ x1 =>
+ match
+ match idc with
+ | ident.Z_opp =>
+ Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x with
+ | @expr.App _
+ _ _ s0 _
+ #(idc0)%expr_pat
+ x2 =>
+ match
+ match
+ idc0
+ with
+ | ident.Z_opp =>
+ Some tt
+ | _ =>
+ None
+ end
+ with
+ | Some
+ _ =>
+ match
+ s0 as t2
+ return
+ (Compile.value'
+ false t2 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t2 =>
+ fun
+ v :
+ defaults.expr
+ (type.base
+ t2) =>
+ base.try_make_transport_cps
+ (fun
+ t1 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t1)) t2
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a :
+ option
+ (defaults.expr
+ (type.base
+ t2) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a
+ with
+ | Some
+ x' =>
+ match
+ s as t3
+ return
+ (Compile.value'
+ false t3 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t3 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t3) =>
+ base.try_make_transport_cps
+ (fun
+ t1 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t1)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
UnderLets.Base
- (x +
- x'2 v2)%expr
- | None =>
+ (x'0 v0 -
+ x' v)%expr
+ | None =>
+ default
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ default
+ end
+ (Compile.reflect
+ x1)
+ | None =>
+ default
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ default
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ default
+ end
+ | @expr.App _
+ _ _ s0 _
+ ($_)%expr
+ _ |
+ @expr.App _
+ _ _ s0 _
+ (@expr.Abs _
+ _ _ _ _ _)
+ _ |
+ @expr.App _
+ _ _ s0 _
+ (_ @ _)%expr_pat
+ _ |
+ @expr.App _
+ _ _ s0 _
+ (@expr.LetIn
+ _ _ _ _ _ _
+ _) _ =>
+ default
+ | _ => default
+ end
+ | None => default
+ end
+ | @expr.App _ _ _ s _
+ ($_)%expr _ |
+ @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _
+ _) _ | @expr.App _
+ _ _ s _
+ (_ @ _)%expr_pat _ |
+ @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _
+ _ _ _) _ => default
+ | _ => default0 tt
+ end in
+ match x with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal t0 v =>
+ match
+ t0 as t1
+ return
+ (base.base_interp t1 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if args <? 0
+ then
+ UnderLets.Base
+ (- (##((- args)%Z) + x0))%expr
+ else default
+ | None => default0 tt
+ end
+ | @expr.App _ _ _ s _ #(idc)%expr_pat
+ x1 =>
+ match
+ match idc with
+ | ident.Z_opp => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x0 with
+ | #(idc0)%expr_pat =>
+ match
+ match idc0 with
+ | @ident.Literal t1 v =>
+ match
+ t1 as t2
+ return
+ (base.base_interp
+ t2 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit =>
+ None
+ | base.type.Z =>
+ fun v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun _ : bool =>
+ None
+ | base.type.nat =>
+ fun _ : nat =>
+ None
+ end v
+ | _ => None
+ end
+ with
+ | Some args0 =>
+ match
+ s as t2
+ return
+ (Compile.value'
+ false t2 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t2 =>
+ fun
+ v : defaults.expr
+ (type.base
+ t2) =>
+ base.try_make_transport_cps
+ (fun
+ t1 : base.type
+ =>
+ defaults.expr
+ (type.base t1))
+ t2 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t2) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args0 >? 0
+ then
+ UnderLets.Base
+ (-
+ (x' v +
+ ##
+ ((- args0)%Z)))%expr
+ else
+ match
+ s as t3
+ return
+ (Compile.value'
+ false t3 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t3 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t3) =>
+ base.try_make_transport_cps
+ (fun
+ t1 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t1)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ args0 <?
+ 0
+ then
UnderLets.Base
- (x - x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value'
+ (##
+ ((- args0)%Z) -
+ x'0 v0)%expr
+ else
+ default
+ | None =>
+ default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ :
+ Compile.value'
false s0 ->
Compile.value'
true d0
- =>
- UnderLets.Base
- (x - x0)%expr
- end
- (Compile.reflect
- x1)
- | None =>
- UnderLets.Base
- (x - x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false
- s0 ->
- Compile.value' true d0
- =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x1)
- | None =>
- UnderLets.Base (x - x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x1)
- | None =>
- if args =? 0
- then UnderLets.Base (- x0)%expr
- else
- if args <? 0
- then UnderLets.Base (- (##((- args)%Z) + x0))%expr
- else UnderLets.Base (x - x0)%expr
- end
- | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
- (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if args =? 0
- then UnderLets.Base (- x0)%expr
- else
- if args <? 0
- then UnderLets.Base (- (##((- args)%Z) + x0))%expr
- else UnderLets.Base (x - x0)%expr
- | _ =>
- if args =? 0
- then UnderLets.Base (- x0)%expr
- else
- if args <? 0
- then UnderLets.Base (- (##((- args)%Z) + x0))%expr
- else UnderLets.Base (x - x0)%expr
- end
- | None =>
- match x0 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base x
- else
- if args <? 0
- then UnderLets.Base (x + ##((- args)%Z))%expr
- else UnderLets.Base (x - x0)%expr
- | None => UnderLets.Base (x - x0)%expr
- end
- | @expr.App _ _ _ s _ #(idc0)%expr_pat x1 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x + x' v)%expr
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x - x0)%expr
- end
- | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
- (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
- (@expr.LetIn _ _ _ _ _ _ _) _ => UnderLets.Base (x - x0)%expr
- | _ => UnderLets.Base (x - x0)%expr
- end
- end
- | ($_)%expr =>
- match x0 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t1 v0 =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base x
- else
- if args <? 0
- then UnderLets.Base (x + ##((- args)%Z))%expr
- else UnderLets.Base (x - x0)%expr
- | None => UnderLets.Base (x - x0)%expr
- end
- | @expr.App _ _ _ s _ #(idc)%expr_pat x1 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x + x' v0)%expr
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun _ : Compile.value' false s0 -> Compile.value' true d0
- => UnderLets.Base (x - x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x - x0)%expr
- end
- | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.Base (x - x0)%expr
- | _ => UnderLets.Base (x - x0)%expr
- end
- | @expr.Abs _ _ _ _ _ _ =>
- match x0 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base x
- else
- if args <? 0
- then UnderLets.Base (x + ##((- args)%Z))%expr
- else UnderLets.Base (x - x0)%expr
- | None => UnderLets.Base (x - x0)%expr
- end
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x1 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x + x' v)%expr
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d1
- => UnderLets.Base (x - x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x - x0)%expr
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _ _ _ s0 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.Base (x - x0)%expr
- | _ => UnderLets.Base (x - x0)%expr
- end
- | @expr.App _ _ _ s _ f x1 =>
- match x0 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base x
- else
- match f with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
+ =>
+ default
+ end
+ (Compile.reflect
+ x1)
+ | None =>
+ default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ : Compile.value'
+ false s0 ->
+ Compile.value'
+ true d0 =>
+ default
+ end
+ (Compile.reflect x1)
+ | None => default
+ end
+ | _ => default
+ end
+ | None => default
+ end
+ | @expr.App _ _ _ s _ ($_)%expr _ |
+ @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
+ _ _ _ s _ (_ @ _)%expr_pat _ |
+ @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _ _ _ _) _ =>
+ default
+ | _ => default0 tt
+ end in
+ match x0 with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal t0 v =>
+ match
+ t0 as t1
+ return (base.base_interp t1 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if args =? 0 then UnderLets.Base x else default
+ | None => default0 tt
+ end
+ | @expr.App _ _ _ s _ #(idc)%expr_pat x1 =>
match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
+ match idc with
+ | ident.Z_opp => Some tt
+ | _ => None
+ end
with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr
- (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args >? 0
- then
- UnderLets.Base
- (- (x' v + ##((- args)%Z)))%expr
- else
+ | Some _ =>
+ match x with
+ | #(idc0)%expr_pat =>
+ match
+ match idc0 with
+ | @ident.Literal t1 v =>
+ match
+ t1 as t2
+ return
+ (base.base_interp t2 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args0 =>
match
- s as t3
+ s as t2
return
- (Compile.value' false t3 ->
+ (Compile.value' false t2 ->
UnderLets.UnderLets base.type ident
var
(defaults.expr
(type.base base.type.Z)))
with
- | type.base t3 =>
- fun
- v0 : defaults.expr (type.base t3)
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
=>
base.try_make_transport_cps
(fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
+ defaults.expr (type.base t1)) t2
base.type.Z
(UnderLets.UnderLets base.type
ident var
(defaults.expr
(type.base base.type.Z)))
(fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base
- base.type.Z)) =>
- match a0 with
- | Some x'0 =>
- if args <? 0
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args0 >? 0
then
UnderLets.Base
- (##((- args)%Z) - x'0 v0)%expr
+ (##(args0) + x' v)%expr
else
- if args <? 0
- then
- UnderLets.Base
- (x + ##((- args)%Z))%expr
- else
- match
- s as t4
- return
- (Compile.value' false
- t4 ->
- UnderLets.UnderLets
- base.type ident var
- (defaults.expr
- (type.base
- base.type.Z)))
- with
- | type.base t4 =>
- fun
- v1 : defaults.expr
- (type.base t4)
- =>
- base.try_make_transport_cps
- (fun t1 : base.type
- =>
- defaults.expr
- (type.base t1)) t4
- base.type.Z
- (UnderLets.UnderLets
- base.type ident
- var
- (defaults.expr
- (type.base
- base.type.Z)))
- (fun
- a1 : option
- (defaults.expr
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t1 : base.type =>
+ defaults.expr
+ (type.base t1)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
(type.base
- t4) ->
- defaults.expr
+ t3) ->
+ defaults.expr
(type.base
base.type.Z))
- =>
- match a1 with
- | Some x'1 =>
- UnderLets.Base
- (-
- (x'1 v1 + x0))%expr
- | None =>
+ =>
+ match a0 with
+ | Some x'0 =>
+ if args0 <? 0
+ then
UnderLets.Base
- (x - x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value'
- false s0 ->
- Compile.value'
- true d0 =>
- UnderLets.Base
- (x - x0)%expr
- end (Compile.reflect x1)
- | None =>
- UnderLets.Base (x - x0)%expr
+ (x'0 v0 -
+ ##((- args0)%Z))%expr
+ else default
+ | None => default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ : Compile.value'
+ false s0 ->
+ Compile.value'
+ true d0 =>
+ default
+ end (Compile.reflect x1)
+ | None => default
end)
| (s0 -> d0)%ptype =>
fun
_ : Compile.value' false s0 ->
Compile.value' true d0 =>
- UnderLets.Base (x - x0)%expr
+ default
end (Compile.reflect x1)
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x1)
- | None =>
- if args <? 0
- then UnderLets.Base (x + ##((- args)%Z))%expr
- else UnderLets.Base (x - x0)%expr
- end
- | _ =>
- if args <? 0
- then UnderLets.Base (x + ##((- args)%Z))%expr
- else UnderLets.Base (x - x0)%expr
- end
- | None =>
- match f with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- UnderLets.Base (- (x' v + x0))%expr
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x - x0)%expr
- end
- | _ => UnderLets.Base (x - x0)%expr
- end
- end
- | ($_)%expr =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x' v0 + x0))%expr
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x - x0)%expr
- end
- | _ => UnderLets.Base (x - x0)%expr
- end
- | @expr.Abs _ _ _ _ _ _ =>
- match f with
- | #(idc)%expr_pat =>
+ | None => default
+ end
+ | _ => default
+ end
+ | None => default
+ end
+ | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
+ (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _ _ _ _) _ => default
+ | _ => default0 tt
+ end in
+ match x with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal t0 v =>
+ match t0 as t1 return (base.base_interp t1 -> option Z) with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ llet default1 := fun 'tt =>
+ if args =? 0
+ then UnderLets.Base (- x0)%expr
+ else default in
+ match x0 with
+ | @expr.App _ _ _ s _ #(idc0)%expr_pat x1 =>
match
- match idc with
+ match idc0 with
| ident.Z_opp => Some tt
| _ => None
end
@@ -3497,156 +2864,6 @@ match idc in (ident t) return (Compile.value' true t) with
| type.base t2 =>
fun v : defaults.expr (type.base t2) =>
base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x' v + x0))%expr
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x - x0)%expr
- end
- | _ => UnderLets.Base (x - x0)%expr
- end
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x2 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match f with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- match
- s0 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base base.type.Z)))
- with
- | type.base t3 =>
- fun v0 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base base.type.Z)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- UnderLets.Base
- (x'0 v0 - x' v)%expr
- | None =>
- UnderLets.Base (x - x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x2)
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x1)
- | None =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' => UnderLets.Base (x + x' v)%expr
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x2)
- end
- | ($_)%expr =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
(fun t1 : base.type => defaults.expr (type.base t1))
t2 base.type.Z
(UnderLets.UnderLets base.type ident var
@@ -3656,368 +2873,40 @@ match idc in (ident t) return (Compile.value' true t) with
(defaults.expr (type.base t2) ->
defaults.expr (type.base base.type.Z)) =>
match a with
- | Some x' => UnderLets.Base (x + x' v0)%expr
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x2)
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x + x' v)%expr
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x2)
- | _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x + x' v)%expr
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x2)
- end
- | None =>
- match f with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- UnderLets.Base (- (x' v + x0))%expr
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x - x0)%expr
- end
- | _ => UnderLets.Base (x - x0)%expr
- end
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x' v0 + x0))%expr
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x - x0)%expr
- end
- | _ => UnderLets.Base (x - x0)%expr
- end
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0
- _ (_ @ _)%expr_pat _ =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x' v + x0))%expr
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x - x0)%expr
- end
- | _ => UnderLets.Base (x - x0)%expr
- end
- | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x' v + x0))%expr
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x - x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x - x0)%expr
- end
- | _ => UnderLets.Base (x - x0)%expr
- end
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match f with
- | #(idc)%expr_pat =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (- (x' v + x0))%expr
- | None => UnderLets.Base (x - x0)%expr
+ | Some x' =>
+ if args =? 0
+ then UnderLets.Base (x' v)
+ else default
+ | None => default
end)
| (s0 -> d0)%ptype =>
fun
_ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x - x0)%expr
+ Compile.value' true d0 => default
end (Compile.reflect x1)
- | None => UnderLets.Base (x - x0)%expr
+ | None => default
end
- | _ => UnderLets.Base (x - x0)%expr
- end
- end
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match x0 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base x
- else
- if args <? 0
- then UnderLets.Base (x + ##((- args)%Z))%expr
- else UnderLets.Base (x - x0)%expr
- | None => UnderLets.Base (x - x0)%expr
- end
- | @expr.App _ _ _ s _ #(idc)%expr_pat x2 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr (type.base base.type.Z)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' => UnderLets.Base (x + x' v)%expr
- | None => UnderLets.Base (x - x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun _ : Compile.value' false s0 -> Compile.value' true d0
- => UnderLets.Base (x - x0)%expr
- end (Compile.reflect x2)
- | None => UnderLets.Base (x - x0)%expr
+ | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
+ (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _ _ _ _) _ => default
+ | _ => default1 tt
end
- | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.Base (x - x0)%expr
- | _ => UnderLets.Base (x - x0)%expr
+ | None => default0 tt
end
+ | _ => default0 tt
end
| ident.Z_opp =>
fun x : defaults.expr (type.base base.type.Z) =>
+ llet default := UnderLets.Base (- x)%expr in
+ llet default0 := fun 'tt =>
+ if negb (SubstVarLike.is_var_fst_snd_pair_opp x)
+ then
+ UnderLets.UnderLet x
+ (fun v : var (type.base base.type.Z) =>
+ UnderLets.Base (- $v)%expr)
+ else default in
match x with
- | ($_)%expr =>
- if negb (SubstVarLike.is_var_fst_snd_pair_opp x)
- then
- UnderLets.UnderLet x
- (fun v0 : var (type.base base.type.Z) =>
- UnderLets.Base (- $v0)%expr)
- else UnderLets.Base (- x)%expr
| @expr.App _ _ _ s _ #(idc)%expr_pat x0 =>
match match idc with
| ident.Z_opp => Some tt
@@ -4044,44 +2933,22 @@ match idc in (ident t) return (Compile.value' true t) with
defaults.expr (type.base base.type.Z)) =>
match a with
| Some x' => UnderLets.Base (x' v)
- | None => UnderLets.Base (- x)%expr
+ | None => default
end)
| (s0 -> d0)%ptype =>
fun _ : Compile.value' false s0 -> Compile.value' true d0 =>
- UnderLets.Base (- x)%expr
+ default
end (Compile.reflect x0)
- | None =>
- if negb (SubstVarLike.is_var_fst_snd_pair_opp x)
- then
- UnderLets.UnderLet x
- (fun v : var (type.base base.type.Z) =>
- UnderLets.Base (- $v)%expr)
- else UnderLets.Base (- x)%expr
+ | None => default
end
- | @expr.App _ _ _ s _ ($_)%expr _ =>
- if negb (SubstVarLike.is_var_fst_snd_pair_opp x)
- then
- UnderLets.UnderLet x
- (fun v0 : var (type.base base.type.Z) =>
- UnderLets.Base (- $v0)%expr)
- else UnderLets.Base (- x)%expr
- | @expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
- (_ @ _)%expr_pat _ | @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _)
- _ =>
- if negb (SubstVarLike.is_var_fst_snd_pair_opp x)
- then
- UnderLets.UnderLet x
- (fun v : var (type.base base.type.Z) => UnderLets.Base (- $v)%expr)
- else UnderLets.Base (- x)%expr
- | _ =>
- if negb (SubstVarLike.is_var_fst_snd_pair_opp x)
- then
- UnderLets.UnderLet x
- (fun v : var (type.base base.type.Z) => UnderLets.Base (- $v)%expr)
- else UnderLets.Base (- x)%expr
+ | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _ (_ @ _)%expr_pat _ |
+ @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ => default
+ | _ => default0 tt
end
| ident.Z_div =>
fun x x0 : defaults.expr (type.base base.type.Z) =>
+ llet default := UnderLets.Base (x / x0)%expr in
match x0 with
| #(idc)%expr_pat =>
match
@@ -4102,13 +2969,14 @@ match idc in (ident t) return (Compile.value' true t) with
else
if args =? 2 ^ Z.log2 args
then UnderLets.Base (x >> ##(Z.log2 args))%expr
- else UnderLets.Base (x / x0)%expr
- | None => UnderLets.Base (x / x0)%expr
+ else default
+ | None => default
end
- | _ => UnderLets.Base (x / x0)%expr
+ | _ => default
end
| ident.Z_modulo =>
fun x x0 : defaults.expr (type.base base.type.Z) =>
+ llet default := UnderLets.Base (x mod x0)%expr in
match x0 with
| #(idc)%expr_pat =>
match
@@ -4129,40 +2997,76 @@ match idc in (ident t) return (Compile.value' true t) with
else
if args =? 2 ^ Z.log2 args
then UnderLets.Base (x &' ##((args - 1)%Z))%expr
- else UnderLets.Base (x mod x0)%expr
- | None => UnderLets.Base (x mod x0)%expr
+ else default
+ | None => default
end
- | _ => UnderLets.Base (x mod x0)%expr
+ | _ => default
end
| ident.Z_log2 =>
fun x : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_log2)%expr @ x)%expr_pat
+ llet default := UnderLets.Base (#(ident.Z_log2)%expr @ x)%expr_pat in
+ default
| ident.Z_log2_up =>
fun x : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_log2_up)%expr @ x)%expr_pat
+ llet default := UnderLets.Base (#(ident.Z_log2_up)%expr @ x)%expr_pat in
+ default
| ident.Z_eqb =>
fun x x0 : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_eqb)%expr @ x @ x0)%expr_pat
+ llet default := UnderLets.Base (#(ident.Z_eqb)%expr @ x @ x0)%expr_pat in
+ default
| ident.Z_leb =>
fun x x0 : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_leb)%expr @ x @ x0)%expr_pat
+ llet default := UnderLets.Base (#(ident.Z_leb)%expr @ x @ x0)%expr_pat in
+ default
| ident.Z_geb =>
fun x x0 : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_geb)%expr @ x @ x0)%expr_pat
+ llet default := UnderLets.Base (#(ident.Z_geb)%expr @ x @ x0)%expr_pat in
+ default
| ident.Z_of_nat =>
fun x : defaults.expr (type.base base.type.nat) =>
- UnderLets.Base (#(ident.Z_of_nat)%expr @ x)%expr_pat
+ llet default := UnderLets.Base (#(ident.Z_of_nat)%expr @ x)%expr_pat in
+ default
| ident.Z_to_nat =>
fun x : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_to_nat)%expr @ x)%expr_pat
+ llet default := UnderLets.Base (#(ident.Z_to_nat)%expr @ x)%expr_pat in
+ default
| ident.Z_shiftr =>
fun x x0 : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (x >> x0)%expr
+ llet default := UnderLets.Base (x >> x0)%expr in
+ default
| ident.Z_shiftl =>
fun x x0 : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (x << x0)%expr
+ llet default := UnderLets.Base (x << x0)%expr in
+ default
| ident.Z_land =>
fun x x0 : defaults.expr (type.base base.type.Z) =>
+ llet default := UnderLets.Base (x &' x0)%expr in
+ llet default0 := fun 'tt =>
+ match x with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal t0 v =>
+ match
+ t0 as t1
+ return (base.base_interp t1 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if args =? 0
+ then UnderLets.Base ##(0)%expr
+ else default
+ | None => default
+ end
+ | _ => default
+ end in
match x0 with
| #(idc)%expr_pat =>
match
@@ -4178,121 +3082,38 @@ match idc in (ident t) return (Compile.value' true t) with
end
with
| Some args =>
- if args =? 0
- then UnderLets.Base ##(0)%expr
- else
- match x with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if args0 =? 0
- then UnderLets.Base ##(0)%expr
- else UnderLets.Base (x &' x0)%expr
- | None => UnderLets.Base (x &' x0)%expr
- end
- | _ => UnderLets.Base (x &' x0)%expr
- end
- | None =>
- match x with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base ##(0)%expr
- else UnderLets.Base (x &' x0)%expr
- | None => UnderLets.Base (x &' x0)%expr
- end
- | _ => UnderLets.Base (x &' x0)%expr
- end
- end
- | ($_)%expr =>
- match x with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t1 v0 =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base ##(0)%expr
- else UnderLets.Base (x &' x0)%expr
- | None => UnderLets.Base (x &' x0)%expr
- end
- | _ => UnderLets.Base (x &' x0)%expr
- end
- | _ =>
- match x with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args =? 0
- then UnderLets.Base ##(0)%expr
- else UnderLets.Base (x &' x0)%expr
- | None => UnderLets.Base (x &' x0)%expr
- end
- | _ => UnderLets.Base (x &' x0)%expr
+ if args =? 0 then UnderLets.Base ##(0)%expr else default
+ | None => default0 tt
end
+ | _ => default0 tt
end
| ident.Z_lor =>
fun x x0 : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (x || x0)%expr
+ llet default := UnderLets.Base (x || x0)%expr in
+ default
| ident.Z_bneg =>
fun x : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_bneg)%expr @ x)%expr_pat
+ llet default := UnderLets.Base (#(ident.Z_bneg)%expr @ x)%expr_pat in
+ default
| ident.Z_lnot_modulo =>
fun x x0 : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_lnot_modulo)%expr @ x @ x0)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.Z_lnot_modulo)%expr @ x @ x0)%expr_pat in
+ default
| ident.Z_mul_split =>
fun x x0 x1 : defaults.expr (type.base base.type.Z) =>
+ llet default := UnderLets.Base
+ (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat in
+ llet default0 := fun 'tt =>
+ UnderLets.UnderLet
+ (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
+ (fun
+ v : var
+ (type.base (base.type.Z * base.type.Z)%etype)
+ =>
+ UnderLets.Base
+ (#(ident.fst)%expr @ ($v)%expr,
+ #(ident.snd)%expr @ ($v)%expr)%expr_pat) in
match x with
| #(idc)%expr_pat =>
match
@@ -4308,6 +3129,248 @@ match idc in (ident t) return (Compile.value' true t) with
end
with
| Some _ =>
+ llet default1 := fun 'tt =>
+ llet default1 := fun 'tt =>
+ llet default1 := fun 'tt =>
+ llet default1 :=
+ fun 'tt =>
+ llet default1 :=
+ fun 'tt =>
+ match x1 with
+ | #(idc0)%expr_pat =>
+ match
+ match
+ idc0
+ with
+ | @ident.Literal
+ t1 v =>
+ match
+ t1 as t2
+ return
+ (base.base_interp
+ t2 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args0 =>
+ if
+ args0 =?
+ -1
+ then
+ UnderLets.Base
+ (
+ (- x0)%expr,
+ ##
+ (0)%expr)%expr_pat
+ else
+ default
+ | None =>
+ default
+ end
+ | _ => default
+ end in
+ match x0 with
+ | #(idc0)%expr_pat =>
+ match
+ match
+ idc0
+ with
+ | @ident.Literal
+ t1 v =>
+ match
+ t1 as t2
+ return
+ (base.base_interp
+ t2 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args0 =>
+ if
+ args0 =?
+ -1
+ then
+ UnderLets.Base
+ (
+ (- x1)%expr,
+ ##
+ (0)%expr)%expr_pat
+ else
+ default
+ | None =>
+ default1
+ tt
+ end
+ | _ =>
+ default1
+ tt
+ end in
+ match x1 with
+ | #(idc0)%expr_pat =>
+ match
+ match
+ idc0
+ with
+ | @ident.Literal
+ t1 v =>
+ match
+ t1 as t2
+ return
+ (base.base_interp
+ t2 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args0 =>
+ if
+ args0 =?
+ 1
+ then
+ UnderLets.Base
+ (x0,
+ ##
+ (0)%expr)%expr_pat
+ else
+ default
+ | None =>
+ default1
+ tt
+ end
+ | _ =>
+ default1
+ tt
+ end in
+ match x0 with
+ | #(idc0)%expr_pat =>
+ match
+ match idc0 with
+ | @ident.Literal t1 v =>
+ match
+ t1 as t2
+ return
+ (base.base_interp
+ t2 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit =>
+ None
+ | base.type.Z =>
+ fun v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun _ : bool =>
+ None
+ | base.type.nat =>
+ fun _ : nat =>
+ None
+ end v
+ | _ => None
+ end
+ with
+ | Some args0 =>
+ if args0 =? 1
+ then
+ UnderLets.Base
+ (x1, ##(0)%expr)%expr_pat
+ else default
+ | None => default1 tt
+ end
+ | _ => default1 tt
+ end in
+ match x1 with
+ | #(idc0)%expr_pat =>
+ match
+ match idc0 with
+ | @ident.Literal t1 v =>
+ match
+ t1 as t2
+ return
+ (base.base_interp t2 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args0 =>
+ if args0 =? 0
+ then
+ UnderLets.Base
+ (##(0)%expr, ##(0)%expr)%expr_pat
+ else default
+ | None => default1 tt
+ end
+ | _ => default1 tt
+ end in
match x0 with
| #(idc0)%expr_pat =>
match
@@ -4327,1058 +3390,305 @@ match idc in (ident t) return (Compile.value' true t) with
| Some args0 =>
if args0 =? 0
then UnderLets.Base (##(0)%expr, ##(0)%expr)%expr_pat
- else
- match x1 with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args1 =>
- if args1 =? 0
- then
- UnderLets.Base
- (##(0)%expr, ##(0)%expr)%expr_pat
- else
- if args0 =? 1
- then UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- if args1 =? 1
- then UnderLets.Base (x0, ##(0)%expr)%expr_pat
- else
- if args0 =? -1
- then
- UnderLets.Base
- ((- x1)%expr, ##(0)%expr)%expr_pat
- else
- if args1 =? -1
- then
- UnderLets.Base
- ((- x0)%expr, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- if args0 =? 1
- then UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- if args0 =? -1
- then
- UnderLets.Base
- ((- x1)%expr, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args0 =? 1
- then UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- if args0 =? -1
- then
- UnderLets.Base ((- x1)%expr, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- if args0 =? 1
- then UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- if args0 =? -1
- then
- UnderLets.Base ((- x1)%expr, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | None =>
- match x1 with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if args0 =? 0
- then
- UnderLets.Base (##(0)%expr, ##(0)%expr)%expr_pat
- else
- if args0 =? 1
- then UnderLets.Base (x0, ##(0)%expr)%expr_pat
- else
- if args0 =? -1
- then
- UnderLets.Base
- ((- x0)%expr, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- end
- | ($_)%expr =>
- match x1 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t2 v0 =>
- match
- t2 as t3 return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some args0 =>
- if args0 =? 0
- then UnderLets.Base (##(0)%expr, ##(0)%expr)%expr_pat
- else
- if args0 =? 1
- then UnderLets.Base (x0, ##(0)%expr)%expr_pat
- else
- if args0 =? -1
- then
- UnderLets.Base ((- x0)%expr, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v1 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | _ =>
- match x1 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if args0 =? 0
- then UnderLets.Base (##(0)%expr, ##(0)%expr)%expr_pat
- else
- if args0 =? 1
- then UnderLets.Base (x0, ##(0)%expr)%expr_pat
- else
- if args0 =? -1
- then
- UnderLets.Base ((- x0)%expr, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
+ else default
+ | None => default1 tt
end
+ | _ => default1 tt
end
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
+ | None => default0 tt
end
- | ($_)%expr =>
- UnderLets.UnderLet (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr, #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr, #(ident.snd)%expr @ ($v)%expr)%expr_pat)
+ | _ => default0 tt
end
| ident.Z_add_get_carry =>
fun x x0 x1 : defaults.expr (type.base base.type.Z) =>
- match x0 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match t0 as t1 return (base.base_interp t1 -> option Z) with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- match x1 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x1 @
- ##((- args)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- if args0 <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @
- ##((- args0)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- if args0 =? 0
- then UnderLets.Base (x0, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x1 @
- ##((- args)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x1 @
- ##((- args)%Z)%expr)%expr_pat
- (fun
- v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s _ #(idc0)%expr_pat x2 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @
- x' v)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | None =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x1 @
- ##((- args)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ ($_)%expr _ =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x1 @
- ##((- args)%Z)%expr)%expr_pat
- (fun
- v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _
- s _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x1 @
- ##((- args)%Z)%expr)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x1 @
- ##((- args)%Z)%expr)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | None =>
- match x1 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @
- ##((- args)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x0, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s _ #(idc0)%expr_pat x2 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @
- x' v)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _
- s _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- end
- | ($_)%expr =>
- match x1 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t1 v0 =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some args =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @
- ##((- args)%Z)%expr)%expr_pat
- (fun
- v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x0, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v1 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | @expr.App _ _ _ s _ #(idc)%expr_pat x2 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x' v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- (- (#(ident.snd)%expr @ $v1)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun _ : Compile.value' false s0 -> Compile.value' true d0
- =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v1 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | @expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
- (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | @expr.Abs _ _ _ _ _ _ =>
- match x1 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @
- ##((- args)%Z)%expr)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x0, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x2 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x' v)%expr_pat
- (fun
- v0 : var
+ llet default := UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat in
+ llet default0 := fun 'tt =>
+ llet default0 := fun 'tt =>
+ llet default0 := fun 'tt =>
+ llet default0 :=
+ fun 'tt =>
+ llet default0 :=
+ fun 'tt =>
+ llet default0 :=
+ fun 'tt =>
+ UnderLets.UnderLet
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ (fun
+ v : var
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)
+ =>
+ UnderLets.Base
+ (#(ident.fst)%expr @
+ ($v)%expr,
+ #(ident.snd)%expr @
+ ($v)%expr)%expr_pat) in
+ match x1 with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal
+ t0 v =>
+ match
+ t0 as t1
+ return
+ (base.base_interp
+ t1 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if args =? 0
+ then
+ UnderLets.Base
+ (x0,
+ ##(0)%expr)%expr_pat
+ else default
+ | None =>
+ default0 tt
+ end
+ | _ => default0 tt
+ end in
+ match x0 with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal
+ t0 v =>
+ match
+ t0 as t1
+ return
+ (base.base_interp
+ t1 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if args =? 0
+ then
+ UnderLets.Base
+ (x1,
+ ##(0)%expr)%expr_pat
+ else default
+ | None =>
+ default0 tt
+ end
+ | _ => default0 tt
+ end in
+ match x1 with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal
+ t0 v =>
+ match
+ t0 as t1
+ return
+ (base.base_interp
+ t1 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if args <? 0
+ then
+ UnderLets.UnderLet
+ (#(ident.Z_sub_get_borrow)%expr @
+ x @ x0 @
+ ##
+ ((- args)%Z)%expr)%expr_pat
+ (fun
+ v :
+ var
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)
+ =>
+ UnderLets.Base
+ (
+ #
+ (ident.fst)%expr @
+ ($v)%expr,
+ (-
+ (#
+ (ident.snd)%expr @
+ $v)%expr_pat)%expr)%expr_pat)
+ else default
+ | None =>
+ default0 tt
+ end
+ | _ => default0 tt
+ end in
+ match x0 with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal t0 v =>
+ match
+ t0 as t1
+ return
+ (base.base_interp t1 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ if args <? 0
+ then
+ UnderLets.UnderLet
+ (#(ident.Z_sub_get_borrow)%expr @
+ x @ x1 @
+ ##((- args)%Z)%expr)%expr_pat
+ (fun
+ v : var
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)
+ =>
+ UnderLets.Base
+ (#(ident.fst)%expr @
+ ($v)%expr,
+ (-
+ (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
+ else default
+ | None => default0 tt
+ end
+ | _ => default0 tt
+ end in
+ match x1 with
+ | @expr.App _ _ _ s _ #(idc)%expr_pat x2 =>
+ match
+ match idc with
+ | ident.Z_opp => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match
+ s as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
(type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d1
- =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0
- _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s0 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t0 : base.type =>
+ defaults.expr (type.base t0)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ UnderLets.UnderLet
+ (#(ident.Z_sub_get_borrow)%expr @ x @
+ x0 @ x' v)%expr_pat
+ (fun
+ v0 : var
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)
+ =>
+ UnderLets.Base
+ (#(ident.fst)%expr @ ($v0)%expr,
+ (-
+ (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
+ | None => default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ : Compile.value' false s0 ->
+ Compile.value' true d0 => default
+ end (Compile.reflect x2)
+ | None => default
+ end
+ | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
+ (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _ _ _ _) _ => default
+ | _ => default0 tt
+ end in
+ match x0 with
| @expr.App _ _ _ s _ #(idc)%expr_pat x2 =>
match match idc with
| ident.Z_opp => Some tt
@@ -5416,867 +3726,28 @@ match idc in (ident t) return (Compile.value' true t) with
UnderLets.Base
(#(ident.fst)%expr @ ($v0)%expr,
(- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | None => default
end)
| (s0 -> d0)%ptype =>
fun _ : Compile.value' false s0 -> Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ default
end (Compile.reflect x2)
- | None =>
- match x1 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @
- ##((- args)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x0, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ #(idc0)%expr_pat x3 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @
- x' v)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _
- _ s0 _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s0 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- end
- | @expr.App _ _ _ s _ ($_)%expr _ =>
- match x1 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t1 v0 =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some args =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @
- ##((- args)%Z)%expr)%expr_pat
- (fun
- v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x0, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v1 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x3 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => defaults.expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x' v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- (- (#(ident.snd)%expr @ $v1)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d1
- =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v1 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0
- _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s0 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ =>
- match x1 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @
- ##((- args)%Z)%expr)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x0, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ #(idc)%expr_pat x3 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x' v)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun _ : Compile.value' false s2 -> Compile.value' true d2
- =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s1 _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1
- _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s1 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ (_ @ _)%expr_pat _ =>
- match x1 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @
- ##((- args)%Z)%expr)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x0, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ #(idc)%expr_pat x4 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x' v)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun _ : Compile.value' false s2 -> Compile.value' true d2
- =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x4)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s1 _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1
- _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s1 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- match x1 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @
- ##((- args)%Z)%expr)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x0, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x4 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x' v)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d1
- =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x4)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0
- _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s0 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match x1 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @
- ##((- args)%Z)%expr)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then UnderLets.Base (x0, ##(0)%expr)%expr_pat
- else
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun
- v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s _ #(idc)%expr_pat x3 =>
- match
- match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => defaults.expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x' v)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun _ : Compile.value' false s0 -> Compile.value' true d0
- =>
- UnderLets.Base
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
- (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
+ | None => default
end
+ | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _ (_ @ _)%expr_pat _ |
+ @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ => default
+ | _ => default0 tt
end
| ident.Z_add_with_carry =>
fun x x0 x1 : defaults.expr (type.base base.type.Z) =>
+ llet default := UnderLets.Base
+ (#(ident.Z_add_with_carry)%expr @ x @ x0 @ x1)%expr_pat in
+ llet default0 := fun 'tt =>
+ UnderLets.UnderLet
+ (#(ident.Z_add_with_carry)%expr @ x @ x0 @ x1)%expr_pat
+ (fun v : var (type.base base.type.Z) =>
+ UnderLets.Base ($v)%expr) in
match x with
| #(idc)%expr_pat =>
match
@@ -6292,340 +3763,55 @@ match idc in (ident t) return (Compile.value' true t) with
end
with
| Some args =>
- if args =? 0
- then UnderLets.Base (x0 + x1)%expr
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base base.type.Z) =>
- UnderLets.Base ($v)%expr)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base base.type.Z) =>
- UnderLets.Base ($v)%expr)
+ if args =? 0 then UnderLets.Base (x0 + x1)%expr else default
+ | None => default0 tt
end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v0 : var (type.base base.type.Z) => UnderLets.Base ($v0)%expr)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_carry)%expr @ x @ x0 @ x1)%expr_pat
- (fun v : var (type.base base.type.Z) => UnderLets.Base ($v)%expr)
+ | _ => default0 tt
end
| ident.Z_add_with_get_carry =>
fun x x0 x1 x2 : defaults.expr (type.base base.type.Z) =>
- match x0 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match t0 as t1 return (base.base_interp t1 -> option Z) with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- match x1 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- match x2 with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args1 =>
- if
- (args0 <=? 0) && (args <=? 0) &&
- (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x2 @
- ##((- args0)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- if
- (args1 <=? 0) && (args <=? 0) &&
- (args1 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x1 @
- ##((- args1)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc2)%expr_pat =>
- match
- match idc2 with
- | @ident.Literal t3 v =>
- match
- t3 as t4
- return
- (base.base_interp t4 -> option Z)
- with
- | base.type.unit =>
- fun _ : unit => None
- | base.type.Z =>
- fun v0 : Z => Some v0
- | base.type.bool =>
- fun _ : bool => None
- | base.type.nat =>
- fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some _ =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.Base
- (x2, ##(0)%expr)%expr_pat
- else
- if (args =? 0) && (args1 =? 0)
- then
- UnderLets.Base
- (x1, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- if (args0 =? 0) && (args1 =? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ ##(args0)%expr @
- ##(args1)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- ##(0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- if (args0 =? 0) && (args1 =? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ ##(args0)%expr @
- ##(args1)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- ##(0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- if (args0 =? 0) && (args1 =? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ ##(args0)%expr @ ##(args1)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- ##(0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- if (args0 =? 0) && (args1 =? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ ##(args0)%expr @ ##(args1)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- ##(0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | None =>
- if
- (args0 <=? 0) && (args <=? 0) &&
- (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x2 @
- ##((- args0)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc2)%expr_pat =>
+ llet default := UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat in
+ llet default0 := fun 'tt =>
+ llet default0 := fun 'tt =>
+ UnderLets.UnderLet
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ (fun
+ v : var
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype) =>
+ UnderLets.Base
+ (#(ident.fst)%expr @ ($v)%expr,
+ #(ident.snd)%expr @ ($v)%expr)%expr_pat) in
+ match x1 with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal t0 v =>
+ match
+ t0 as t1
+ return (base.base_interp t1 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ match x2 with
+ | #(idc0)%expr_pat =>
match
- match idc2 with
- | @ident.Literal t3 v =>
+ match idc0 with
+ | @ident.Literal t1 v =>
match
- t3 as t4
+ t1 as t2
return
- (base.base_interp t4 -> option Z)
+ (base.base_interp t2 -> option Z)
with
| base.type.unit =>
fun _ : unit => None
@@ -6637,55 +3823,13 @@ match idc in (ident t) return (Compile.value' true t) with
| _ => None
end
with
- | Some _ =>
+ | Some args0 =>
if (args =? 0) && (args0 =? 0)
then
- UnderLets.Base
- (x2, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
UnderLets.UnderLet
(#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
+ x @ x0 @ ##(args)%expr @
+ ##(args0)%expr)%expr_pat
(fun
v : var
(type.base
@@ -6693,2494 +3837,514 @@ match idc in (ident t) return (Compile.value' true t) with
base.type.Z)%etype) =>
UnderLets.Base
(#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
+ ##(0)%expr)%expr_pat)
+ else default
+ | None => default
end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- end
- | ($_)%expr =>
- if
- (args0 <=? 0) && (args <=? 0) && (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x2 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t3 v0 =>
- match
- t3 as t4
- return (base.base_interp t4 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some _ =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.Base (x2, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
+ | _ => default
end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
+ | None => default0 tt
end
- | @expr.App _ _ _ s _ #(idc1)%expr_pat x3 =>
- match
- match idc1 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr
- (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @
- x1 @ x' v)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- match
- s as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun
- v0 : defaults.expr
- (type.base t3) =>
- base.try_make_transport_cps
- (fun t4 : base.type =>
- defaults.expr (type.base t4))
- t3 base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base
- base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @
- ##((- args)%Z)%expr @
- x1 @ x'0 v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @
- $v1)%expr_pat)%expr)%expr_pat)
- else
- if
- (args0 <=? 0) &&
- (args <=? 0) &&
- (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @
- ##((- args)%Z)%expr @
- x2 @
- ##((- args0)%Z)%expr)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @
- $v1)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc2)%expr_pat =>
- match
- match idc2 with
- | @ident.Literal
- t5 v1 =>
- match
- t5 as t6
- return
- (base.base_interp
- t6 ->
- option Z)
- with
- | base.type.unit =>
- fun
- _ : unit
- => None
- | base.type.Z =>
- fun v2 : Z
- =>
- Some v2
- | base.type.bool =>
- fun
- _ : bool
- => None
- | base.type.nat =>
- fun
- _ : nat
- => None
- end v1
- | _ => None
- end
- with
- | Some _ =>
- if
- (args =? 0) &&
- (args0 =? 0)
- then
- UnderLets.Base
- (x2,
- ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 :
+ | _ => default0 tt
+ end in
+ match x0 with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal t0 v =>
+ match t0 as t1 return (base.base_interp t1 -> option Z) with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ llet default1 := fun 'tt =>
+ llet default1 := fun 'tt =>
+ llet default1 := fun 'tt =>
+ llet default1 :=
+ fun 'tt =>
+ llet default1 :=
+ fun 'tt =>
+ if args =? 0
+ then
+ UnderLets.UnderLet
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x1 @
+ x2)%expr_pat
+ (fun
+ v :
var
(type.base
(base.type.Z *
base.type.Z)%etype)
- =>
- UnderLets.Base
+ =>
+ UnderLets.Base
(
#
(ident.fst)%expr @
- ($v1)%expr,
+ ($v)%expr,
#
(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v1 :
+ ($v)%expr)%expr_pat)
+ else default in
+ match x with
+ | #(idc0)%expr_pat =>
+ match
+ match
+ idc0
+ with
+ | @ident.Literal
+ t1 v =>
+ match
+ t1 as t2
+ return
+ (base.base_interp
+ t2 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ =>
+ None
+ end
+ with
+ | Some
+ _ =>
+ llet default2 :=
+ fun 'tt
+ =>
+ match
+ x2
+ with
+ | #
+ (idc1)%expr_pat =>
+ match
+ match
+ idc1
+ with
+ | @ident.Literal
+ t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp
+ t3 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args1 =>
+ if
+ (args =?
+ 0) &&
+ (args1 =?
+ 0)
+ then
+ UnderLets.Base
+ (x1,
+ ##
+ (0)%expr)%expr_pat
+ else
+ default
+ | None =>
+ default
+ end
+ | _ =>
+ default
+ end in
+ match
+ x1
+ with
+ | #
+ (idc1)%expr_pat =>
+ match
+ match
+ idc1
+ with
+ | @ident.Literal
+ t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp
+ t3 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args1 =>
+ if
+ (args =?
+ 0) &&
+ (args1 =?
+ 0)
+ then
+ UnderLets.Base
+ (x2,
+ ##
+ (0)%expr)%expr_pat
+ else
+ default
+ | None =>
+ default2
+ tt
+ end
+ | _ =>
+ default2
+ tt
+ end
+ | None =>
+ default1
+ tt
+ end
+ | _ =>
+ default1
+ tt
+ end in
+ match x2 with
+ | #(idc0)%expr_pat =>
+ match
+ match
+ idc0
+ with
+ | @ident.Literal
+ t1 v =>
+ match
+ t1 as t2
+ return
+ (base.base_interp
+ t2 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args0 =>
+ if
+ (args0 <=?
+ 0) &&
+ (args <=?
+ 0) &&
+ (args0 +
+ args <? 0)
+ then
+ UnderLets.UnderLet
+ (#
+ (ident.Z_sub_with_get_borrow)%expr @
+ x @
+ ##
+ ((- args)%Z)%expr @
+ x1 @
+ ##
+ ((- args0)%Z)%expr)%expr_pat
+ (fun
+ v :
var
(type.base
(base.type.Z *
base.type.Z)%etype)
- =>
- UnderLets.Base
+ =>
+ UnderLets.Base
(
#
(ident.fst)%expr @
- ($v1)%expr,
- #
+ ($v)%expr,
+ (-
+ (#
(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 :
- var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#
- (ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v1 :
- var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#
- (ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- #(ident.snd)%expr @
- ($v2)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- #(ident.snd)%expr @
- ($v2)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
+ $v)%expr_pat)%expr)%expr_pat)
+ else
+ default
+ | None =>
+ default1
+ tt
+ end
+ | _ =>
+ default1
+ tt
+ end in
+ match x1 with
+ | #(idc0)%expr_pat =>
+ match
+ match idc0 with
+ | @ident.Literal t1 v =>
+ match
+ t1 as t2
+ return
+ (base.base_interp
+ t2 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit =>
+ None
+ | base.type.Z =>
+ fun v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun _ : bool =>
+ None
+ | base.type.nat =>
+ fun _ : nat =>
+ None
+ end v
+ | _ => None
+ end
+ with
+ | Some args0 =>
+ if
+ (args0 <=? 0) &&
+ (args <=? 0) &&
+ (args0 + args <? 0)
+ then
+ UnderLets.UnderLet
+ (#(ident.Z_sub_with_get_borrow)%expr @
+ x @
+ ##((- args)%Z)%expr @
+ x2 @
+ ##((- args0)%Z)%expr)%expr_pat
+ (fun
+ v : var
+ (type.base
(base.type.Z *
base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- end
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- if
- (args0 <=? 0) && (args <=? 0) &&
- (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x2 @
- ##((- args0)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc2)%expr_pat =>
+ =>
+ UnderLets.Base
+ (#(ident.fst)%expr @
+ ($v)%expr,
+ (-
+ (#(ident.snd)%expr @
+ $v)%expr_pat)%expr)%expr_pat)
+ else default
+ | None => default1 tt
+ end
+ | _ => default1 tt
+ end in
+ match x2 with
+ | @expr.App _ _ _ s _ #(idc0)%expr_pat x3 =>
match
- match idc2 with
- | @ident.Literal t3 v =>
- match
- t3 as t4
- return
- (base.base_interp t4 -> option Z)
- with
- | base.type.unit =>
- fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool =>
- fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
+ match idc0 with
+ | ident.Z_opp => Some tt
| _ => None
end
with
| Some _ =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.Base
- (x2, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- end
- | @expr.App _ _ _ s _ ($_)%expr _ =>
- if
- (args0 <=? 0) && (args <=? 0) && (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x2 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t3 v0 =>
- match
- t3 as t4
- return (base.base_interp t4 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some _ =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.Base (x2, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
+ match
+ s as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
(type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ |
- @expr.App _ _ _ s _ (_ @ _)%expr_pat _ | @expr.App _ _
- _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if
- (args0 <=? 0) && (args <=? 0) && (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x2 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some _ =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.Base (x2, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | _ =>
- if
- (args0 <=? 0) && (args <=? 0) && (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x2 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some _ =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.Base (x2, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- end
- | None =>
- match x2 with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if
- (args0 <=? 0) && (args <=? 0) &&
- (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x1 @
- ##((- args0)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc2)%expr_pat =>
- match
- match idc2 with
- | @ident.Literal t3 v =>
- match
- t3 as t4
- return
- (base.base_interp t4 -> option Z)
- with
- | base.type.unit =>
- fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool =>
- fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some _ =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.Base
- (x1, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t1 : base.type =>
+ defaults.expr (type.base t1)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
(type.base
(base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s _ #(idc1)%expr_pat x3 =>
- match
- match idc1 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr
- (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @
- x1 @ x' v)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- match
- s as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun
- v0 : defaults.expr
- (type.base t3) =>
- base.try_make_transport_cps
- (fun t4 : base.type =>
- defaults.expr (type.base t4))
- t3 base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base
- base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @
- ##((- args)%Z)%expr @
- x1 @ x'0 v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @
- $v1)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ ($_)%expr _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ |
- @expr.App _ _ _ s _ (_ @ _)%expr_pat _ | @expr.App _ _
- _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- end
- | ($_)%expr =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t2 v0 =>
- match
- t2 as t3 return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some args0 =>
- if
- (args0 <=? 0) && (args <=? 0) && (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x1 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t3 v0 =>
- match
- t3 as t4
- return (base.base_interp t4 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some _ =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | @expr.App _ _ _ s _ #(idc0)%expr_pat x3 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @
- x1 @ x' v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- (-
- (#(ident.snd)%expr @ $v1)%expr_pat)%expr)%expr_pat)
- else
- match
- s as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun v1 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t4 : base.type =>
- defaults.expr (type.base t4)) t3
- base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ ##((- args)%Z)%expr @
- x1 @ x'0 v1)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- (-
- (#(ident.snd)%expr @
- $v2)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- #(ident.snd)%expr @
- ($v2)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- #(ident.snd)%expr @
- ($v2)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ ($_)%expr _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | @expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _
- _ _ s _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | @expr.Abs _ _ _ _ _ _ =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if
- (args0 <=? 0) && (args <=? 0) && (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x1 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some _ =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ #(idc0)%expr_pat x3 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @
- x1 @ x' v)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- match
- s0 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun v0 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a0 : option
+ base.type.Z)%etype)))
+ (fun
+ a : option
(defaults.expr
- (type.base t3) ->
+ (type.base t2) ->
defaults.expr
(type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ ##((- args)%Z)%expr @
- x1 @ x'0 v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @
- $v1)%expr_pat)%expr)%expr_pat)
- else
+ =>
+ match a with
+ | Some x' =>
if args =? 0
then
UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
+ (#(ident.Z_sub_get_borrow)%expr @
+ x @ x1 @ x' v)%expr_pat
(fun
- v1 : var
+ v0 : var
(type.base
(base.type.Z *
base.type.Z)%etype)
=>
UnderLets.Base
(#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
+ ($v0)%expr,
+ (-
+ (#(ident.snd)%expr @
+ $v0)%expr_pat)%expr)%expr_pat)
else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t1 : base.type =>
+ defaults.expr
+ (type.base t1)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
(type.base
(base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
- _ _ _ s0 _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s0 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
+ base.type.Z)%etype)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if args <? 0
+ then
+ UnderLets.UnderLet
+ (#(ident.Z_sub_with_get_borrow)%expr @
+ x @
+ ##((- args)%Z)%expr @
+ x1 @
+ x'0 v0)%expr_pat
+ (fun
+ v1 :
+ var
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)
+ =>
+ UnderLets.Base
+ (#(ident.fst)%expr @
+ ($v1)%expr,
+ (-
+ (#
+ (ident.snd)%expr @
+ $v1)%expr_pat)%expr)%expr_pat)
+ else default
+ | None => default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ : Compile.value'
+ false s0 ->
+ Compile.value'
+ true d0 =>
+ default
+ end (Compile.reflect x3)
+ | None => default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ : Compile.value' false s0 ->
+ Compile.value' true d0 =>
+ default
+ end (Compile.reflect x3)
+ | None => default
+ end
+ | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _
+ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
+ _ _ _ s _ (_ @ _)%expr_pat _ | @expr.App _ _ _
+ s _ (@expr.LetIn _ _ _ _ _ _ _) _ => default
+ | _ => default1 tt
+ end in
+ match x1 with
| @expr.App _ _ _ s _ #(idc0)%expr_pat x3 =>
match
match idc0 with
@@ -9270,387 +4434,83 @@ match idc in (ident t) return (Compile.value' true t) with
($v1)%expr,
(-
(#(ident.snd)%expr @ $v1)%expr_pat)%expr)%expr_pat)
- else
- match x2 with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t4 v1 =>
- match
- t4 as t5
- return
- (base.base_interp
- t5 -> option Z)
- with
- | base.type.unit =>
- fun _ : unit =>
- None
- | base.type.Z =>
- fun v2 : Z =>
- Some v2
- | base.type.bool =>
- fun _ : bool =>
- None
- | base.type.nat =>
- fun _ : nat => None
- end v1
- | _ => None
- end
- with
- | Some args1 =>
- if
- (args1 <=? 0) &&
- (args <=? 0) &&
- (args1 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @
- ##((- args)%Z)%expr @
- x1 @
- ##((- args1)%Z)%expr)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @
- $v1)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc2)%expr_pat =>
- match
- match idc2 with
- | @ident.Literal
- t5 v1 =>
- match
- t5 as t6
- return
- (base.base_interp
- t6 ->
+ else default
+ | None => default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ : Compile.value' false s0 ->
+ Compile.value' true d0 => default
+ end (Compile.reflect x3)
+ | None => default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ : Compile.value' false s0 ->
+ Compile.value' true d0 => default
+ end (Compile.reflect x3)
+ | None => default
+ end
+ | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
+ (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _ _ _ _) _ => default
+ | _ => default1 tt
+ end
+ | None => default0 tt
+ end
+ | @expr.App _ _ _ s _ #(idc)%expr_pat x3 =>
+ match match idc with
+ | ident.Z_opp => Some tt
+ | _ => None
+ end with
+ | Some _ =>
+ llet default1 := fun 'tt =>
+ llet default1 := fun 'tt =>
+ llet default1 := fun 'tt =>
+ match x2 with
+ | #(idc0)%expr_pat =>
+ match
+ match
+ idc0
+ with
+ | @ident.Literal
+ t1 v =>
+ match
+ t1 as t2
+ return
+ (base.base_interp
+ t2 ->
option Z)
- with
- | base.type.unit =>
- fun
+ with
+ | base.type.unit =>
+ fun
_ : unit
- => None
- | base.type.Z =>
- fun v2 : Z
- =>
- Some v2
- | base.type.bool =>
- fun
+ => None
+ | base.type.Z =>
+ fun
+ v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun
_ : bool
- => None
- | base.type.nat =>
- fun
+ => None
+ | base.type.nat =>
+ fun
_ : nat
- => None
- end v1
- | _ => None
- end
- with
- | Some _ =>
- if
- (args =? 0) &&
- (args1 =? 0)
- then
- UnderLets.Base
- (x1,
- ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 :
- var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (
- #
- (ident.fst)%expr @
- ($v1)%expr,
- #
- (ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v1 :
- var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (
- #
- (ident.fst)%expr @
- ($v1)%expr,
- #
- (ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 :
- var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#
- (ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v1 :
- var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#
- (ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- #(ident.snd)%expr @
- ($v2)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- #(ident.snd)%expr @
- ($v2)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- end
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- #(ident.snd)%expr @
- ($v2)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- #(ident.snd)%expr @
- ($v2)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _
- #(idc1)%expr_pat x4 =>
- match
- match idc1 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s0 as t4
- return
- (Compile.value' false
- t4 ->
- UnderLets.UnderLets
- base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- with
- | type.base t4 =>
- fun
- v1 : defaults.expr
- (type.base
- t4) =>
- base.try_make_transport_cps
- (fun t5 : base.type
- =>
- defaults.expr
- (type.base t5))
- t4 base.type.Z
- (UnderLets.UnderLets
- base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- (fun
- a1 : option
- (defaults.expr
- (type.base
- t4) ->
- defaults.expr
- (type.base
- base.type.Z))
- =>
- match a1 with
- | Some x'1 =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @
- x @ x1 @
- x'1 v1)%expr_pat
- (fun
- v2 :
- var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (
- #
- (ident.fst)%expr @
- ($v2)%expr,
- (-
- (#
- (ident.snd)%expr @
- $v2)%expr_pat)%expr)%expr_pat)
- else
- match
- s0 as t5
- return
+ => None
+ end v
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args0 =>
+ match
+ s as t2
+ return
(Compile.value'
- false t5 ->
+ false t2 ->
UnderLets.UnderLets
base.type
ident var
@@ -9658,21 +4518,21 @@ match idc in (ident t) return (Compile.value' true t) with
(type.base
(base.type.Z *
base.type.Z)%etype)))
- with
- | type.base
- t5 =>
+ with
+ | type.base
+ t2 =>
fun
- v2 :
+ v :
defaults.expr
(type.base
- t5) =>
+ t2) =>
base.try_make_transport_cps
(fun
- t6 : base.type
+ t1 : base.type
=>
defaults.expr
(type.base
- t6)) t5
+ t1)) t2
base.type.Z
(UnderLets.UnderLets
base.type
@@ -9682,33 +4542,33 @@ match idc in (ident t) return (Compile.value' true t) with
(base.type.Z *
base.type.Z)%etype)))
(fun
- a2 :
+ a :
option
(defaults.expr
(type.base
- t5) ->
+ t2) ->
defaults.expr
(type.base
base.type.Z))
=>
match
- a2
+ a
with
| Some
- x'2 =>
+ x' =>
if
- args <? 0
+ args0 <=?
+ 0
then
UnderLets.UnderLet
(#
(ident.Z_sub_with_get_borrow)%expr @
- x @
+ x @
+ x' v @ x1 @
##
- ((- args)%Z)%expr @
- x1 @
- x'2 v2)%expr_pat
+ ((- args0)%Z)%expr)%expr_pat
(fun
- v3 :
+ v0 :
var
(type.base
(base.type.Z *
@@ -9718,43 +4578,118 @@ match idc in (ident t) return (Compile.value' true t) with
(
#
(ident.fst)%expr @
- ($v3)%expr,
+ ($v0)%expr,
(-
(#
(ident.snd)%expr @
- $v3)%expr_pat)%expr)%expr_pat)
+ $v0)%expr_pat)%expr)%expr_pat)
else
- if
- args =? 0
- then
- UnderLets.UnderLet
- (#
- (ident.Z_add_get_carry)%expr @
- x @ x1 @
- x2)%expr_pat
- (fun
- v3 :
- var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
+ default
+ | None =>
+ default
+ end)
+ | (s0 ->
+ d0)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s0 ->
+ Compile.value'
+ true d0
=>
- UnderLets.Base
- (
- #
- (ident.fst)%expr @
- ($v3)%expr,
- #
- (ident.snd)%expr @
- ($v3)%expr)%expr_pat)
- else
- UnderLets.UnderLet
+ default
+ end
+ (Compile.reflect
+ x3)
+ | None =>
+ default
+ end
+ | _ => default
+ end in
+ match x1 with
+ | #(idc0)%expr_pat =>
+ match
+ match idc0 with
+ | @ident.Literal t1 v =>
+ match
+ t1 as t2
+ return
+ (base.base_interp
+ t2 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit =>
+ None
+ | base.type.Z =>
+ fun v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun _ : bool =>
+ None
+ | base.type.nat =>
+ fun _ : nat =>
+ None
+ end v
+ | _ => None
+ end
+ with
+ | Some args0 =>
+ match
+ s as t2
+ return
+ (Compile.value'
+ false t2 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun
+ v : defaults.expr
+ (type.base
+ t2) =>
+ base.try_make_transport_cps
+ (fun
+ t1 : base.type
+ =>
+ defaults.expr
+ (type.base t1))
+ t2 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t2) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args0 <=? 0
+ then
+ UnderLets.UnderLet
(#
- (ident.Z_add_with_get_carry)%expr @
- x @ x0 @
- x1 @ x2)%expr_pat
+ (ident.Z_sub_with_get_borrow)%expr @
+ x @
+ x' v @ x2 @
+ ##
+ ((- args0)%Z)%expr)%expr_pat
(fun
- v3 :
+ v0 :
var
(type.base
(base.type.Z *
@@ -9764,4801 +4699,151 @@ match idc in (ident t) return (Compile.value' true t) with
(
#
(ident.fst)%expr @
- ($v3)%expr,
- #
- (ident.snd)%expr @
- ($v3)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#
- (ident.Z_add_with_get_carry)%expr @
- x @ x0 @
- x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ :
- Compile.value'
- false s1 ->
- Compile.value'
- true d1
- =>
- UnderLets.Base
+ ($v0)%expr,
+ (-
(#
- (ident.Z_add_with_get_carry)%expr @
- x @ x0 @
- x1 @ x2)%expr_pat
- end
- (Compile.reflect
- x4)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @
- x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value'
- false s1 ->
- Compile.value'
- true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x4)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s0 _ ($_)%expr
- _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- #(ident.snd)%expr @
- ($v2)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- #(ident.snd)%expr @
- ($v2)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _
- (@expr.Abs _ _ _ _ _ _) _ |
- @expr.App _ _ _ s0 _
- (_ @ _)%expr_pat _ | @expr.App
- _ _ _ s0 _
- (@expr.LetIn _ _ _ _ _ _ _)
- _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- end
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- match x2 with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if
- (args0 <=? 0) && (args <=? 0) &&
- (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x1 @
- ##((- args0)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc2)%expr_pat =>
+ (ident.snd)%expr @
+ $v0)%expr_pat)%expr)%expr_pat)
+ else default
+ | None =>
+ default
+ end)
+ | (s0 -> d0)%ptype =>
+ fun
+ _ : Compile.value'
+ false s0 ->
+ Compile.value'
+ true d0 =>
+ default
+ end
+ (Compile.reflect x3)
+ | None => default1 tt
+ end
+ | _ => default1 tt
+ end in
+ match x2 with
+ | @expr.App _ _ _ s0 _ #(idc0)%expr_pat x4 =>
match
- match idc2 with
- | @ident.Literal t3 v =>
- match
- t3 as t4
- return
- (base.base_interp t4 -> option Z)
- with
- | base.type.unit =>
- fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool =>
- fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
+ match idc0 with
+ | ident.Z_opp => Some tt
| _ => None
end
with
| Some _ =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.Base
- (x1, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
+ match
+ s as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t1 : base.type =>
+ defaults.expr (type.base t1)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
(type.base
(base.type.Z *
- base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ #(idc1)%expr_pat x4 =>
- match
- match idc1 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr
- (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @
- x1 @ x' v)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- match
- s0 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun
- v0 : defaults.expr
- (type.base t3) =>
- base.try_make_transport_cps
- (fun t4 : base.type =>
- defaults.expr (type.base t4))
- t3 base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base
- base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @
- ##((- args)%Z)%expr @
- x1 @ x'0 v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @
- $v1)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x4)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x4)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ |
- @expr.App _ _ _ s0 _ (_ @ _)%expr_pat _ | @expr.App _ _
- _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- end
- | @expr.App _ _ _ s _ ($_)%expr _ =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t2 v0 =>
- match
- t2 as t3 return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some args0 =>
- if
- (args0 <=? 0) && (args <=? 0) && (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x1 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t3 v0 =>
- match
- t3 as t4
- return (base.base_interp t4 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some _ =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ #(idc0)%expr_pat x4 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @
- x1 @ x' v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- (-
- (#(ident.snd)%expr @ $v1)%expr_pat)%expr)%expr_pat)
- else
- match
- s0 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun v1 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t4 : base.type =>
- defaults.expr (type.base t4)) t3
- base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ ##((- args)%Z)%expr @
- x1 @ x'0 v1)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- (-
- (#(ident.snd)%expr @
- $v2)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- #(ident.snd)%expr @
- ($v2)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- #(ident.snd)%expr @
- ($v2)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x4)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x4)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
- _ _ _ s0 _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s0 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if
- (args0 <=? 0) && (args <=? 0) && (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x1 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some _ =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ #(idc0)%expr_pat x4 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @
- x1 @ x' v)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- match
- s1 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun v0 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ ##((- args)%Z)%expr @
- x1 @ x'0 v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @
- $v1)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x4)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x4)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s1 _ ($_)%expr _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
- _ _ _ s1 _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s1 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ (_ @ _)%expr_pat _ =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if
- (args0 <=? 0) && (args <=? 0) && (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x1 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some _ =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ #(idc0)%expr_pat x5 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @
- x1 @ x' v)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- match
- s1 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun v0 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ ##((- args)%Z)%expr @
- x1 @ x'0 v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @
- $v1)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x5)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x5)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s1 _ ($_)%expr _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
- _ _ _ s1 _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s1 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if
- (args0 <=? 0) && (args <=? 0) && (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x1 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some _ =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ #(idc0)%expr_pat x5 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @
- x1 @ x' v)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- match
- s0 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun v0 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a0 : option
+ base.type.Z)%etype)))
+ (fun
+ a : option
(defaults.expr
- (type.base t3) ->
+ (type.base t2) ->
defaults.expr
(type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ ##((- args)%Z)%expr @
- x1 @ x'0 v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @
- $v1)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
+ =>
+ match a with
+ | Some x' =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
=>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x5)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x5)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
- _ _ _ s0 _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s0 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if
- (args0 <=? 0) && (args <=? 0) && (args0 + args <? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @ x @
- ##((- args)%Z)%expr @ x1 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- (- (#(ident.snd)%expr @ $v)%expr_pat)%expr)%expr_pat)
- else
- match x with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some _ =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.Base (x1, ##(0)%expr)%expr_pat
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s _ #(idc0)%expr_pat x4 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_get_borrow)%expr @ x @
- x1 @ x' v)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- match
- s as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun v0 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if args <? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ ##((- args)%Z)%expr @
- x1 @ x'0 v0)%expr_pat
- (fun
- v1 : var
+ base.try_make_transport_cps
+ (fun t1 : base.type =>
+ defaults.expr
+ (type.base t1)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
(type.base
(base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @
- $v1)%expr_pat)%expr)%expr_pat)
- else
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @
- x @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x4)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x4)
- | None =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ ($_)%expr _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _
- _ _ s _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- if args =? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_add_get_carry)%expr @ x @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- end
- | None =>
- match x1 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- match x2 with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- ##(args)%expr @ ##(args0)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr, ##(0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- end
- | ($_)%expr =>
- match x1 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t1 v0 =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some args =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t2 v0 =>
- match
- t2 as t3 return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some args0 =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- ##(args)%expr @ ##(args0)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr, ##(0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v1 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ #(idc)%expr_pat x3 =>
- match match idc with
- | ident.Z_opp => Some tt
- | _ => None
- end with
- | Some _ =>
- match x1 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- match x2 with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args1 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr
- (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x2 @
- ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- match
- s as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun
- v0 : defaults.expr
- (type.base t3) =>
- base.try_make_transport_cps
- (fun t4 : base.type =>
- defaults.expr (type.base t4))
- t3 base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base
- base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if args1 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x'0 v0 @ x1 @
- ##((- args1)%Z)%expr)%expr_pat
+ base.type.Z)%etype)))
(fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
=>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @
- $v1)%expr_pat)%expr)%expr_pat)
- else
- if
- (args0 =? 0) &&
- (args1 =? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @
- ##(args0)%expr @
- ##(args1)%expr)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- ##(0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
+ match a0 with
+ | Some x'0 =>
+ UnderLets.UnderLet
+ (#(ident.Z_sub_with_get_borrow)%expr @
+ x @ x' v @ x1 @
+ x'0 v0)%expr_pat
+ (fun
+ v1 :
+ var
+ (type.base
(base.type.Z *
base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- #(ident.snd)%expr @
- ($v1)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr
- (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x2 @
- ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- end
- | ($_)%expr =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v0 @ x2 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- (-
- (#(ident.snd)%expr @ $v1)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | @expr.Abs _ _ _ _ _ _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x2 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | @expr.App _ _ _ s0 _ #(idc1)%expr_pat x4 =>
- match
- match idc1 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr
- (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- match
- s0 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun
- v0 : defaults.expr
- (type.base t3) =>
- base.try_make_transport_cps
- (fun t4 : base.type =>
- defaults.expr (type.base t4))
- t3 base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base
- base.type.Z)) =>
- match a0 with
- | Some x'0 =>
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x1 @
- x'0 v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @
- $v1)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x4)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr
- (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x2 @
- ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v0 @ x2 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- (-
- (#(ident.snd)%expr @ $v1)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ |
- @expr.App _ _ _ s0 _ (_ @ _)%expr_pat _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x2 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x2 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x2 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- end
- | None =>
- match x2 with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr
- (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x1 @
- ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ #(idc1)%expr_pat x4 =>
- match
- match idc1 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr
- (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- match
- s0 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun
- v0 : defaults.expr
- (type.base t3) =>
- base.try_make_transport_cps
- (fun t4 : base.type =>
- defaults.expr (type.base t4))
- t3 base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base
- base.type.Z)) =>
- match a0 with
- | Some x'0 =>
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x1 @
- x'0 v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @
- $v1)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x4)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ |
- @expr.App _ _ _ s0 _ (_ @ _)%expr_pat _ | @expr.App _ _
- _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- end
- | ($_)%expr =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t2 v0 =>
- match
- t2 as t3 return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some args0 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v0 @ x1 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- (-
- (#(ident.snd)%expr @ $v1)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ #(idc0)%expr_pat x4 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- match
- s0 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun v1 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t4 : base.type =>
- defaults.expr (type.base t4)) t3
- base.type.Z
- (UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v0 @ x1 @ x'0 v1)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- (-
- (#(ident.snd)%expr @ $v2)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x4)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
- _ _ _ s0 _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s0 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | @expr.Abs _ _ _ _ _ _ =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x1 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ #(idc0)%expr_pat x4 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- match
- s1 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun v0 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x1 @ x'0 v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @ $v1)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x4)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s1 _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
- _ _ _ s1 _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s1 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
+ =>
+ UnderLets.Base
+ (#(ident.fst)%expr @
+ ($v1)%expr,
+ (-
+ (#(ident.snd)%expr @
+ $v1)%expr_pat)%expr)%expr_pat)
+ | None => default
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 => default
+ end (Compile.reflect x4)
+ | None => default
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ default
+ end (Compile.reflect x3)
+ | None => default
+ end
+ | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _
+ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
+ _ _ _ s0 _ (_ @ _)%expr_pat _ | @expr.App _ _
+ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
+ default
+ | _ => default1 tt
+ end in
+ match x1 with
| @expr.App _ _ _ s0 _ #(idc0)%expr_pat x4 =>
match
match idc0 with
@@ -14629,2041 +4914,39 @@ match idc in (ident t) return (Compile.value' true t) with
($v1)%expr,
(-
(#(ident.snd)%expr @ $v1)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
+ | None => default
end)
| (s1 -> d1)%ptype =>
fun
_ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
+ Compile.value' true d1 => default
end (Compile.reflect x4)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
+ | None => default
end)
| (s1 -> d1)%ptype =>
fun
_ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
+ Compile.value' true d1 => default
end (Compile.reflect x3)
- | None =>
- match x2 with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr
- (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x1 @
- ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ #(idc1)%expr_pat x5 =>
- match
- match idc1 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr
- (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- match
- s1 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun
- v0 : defaults.expr
- (type.base t3) =>
- base.try_make_transport_cps
- (fun t4 : base.type =>
- defaults.expr (type.base t4))
- t3 base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (defaults.expr
- (type.base
- (base.type.Z *
- base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base
- base.type.Z)) =>
- match a0 with
- | Some x'0 =>
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x1 @
- x'0 v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @
- $v1)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x5)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s1 _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ |
- @expr.App _ _ _ s1 _ (_ @ _)%expr_pat _ | @expr.App _ _
- _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t2 v0 =>
- match
- t2 as t3 return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some args0 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v0 @ x1 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- (-
- (#(ident.snd)%expr @ $v1)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ #(idc0)%expr_pat x5 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t3 : base.type =>
- defaults.expr (type.base t3)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- match
- s1 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun v1 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t4 : base.type =>
- defaults.expr (type.base t4)) t3
- base.type.Z
- (UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v0 @ x1 @ x'0 v1)%expr_pat
- (fun
- v2 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v2)%expr,
- (-
- (#(ident.snd)%expr @ $v2)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x5)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s1 _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
- _ _ _ s1 _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s1 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x1 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s2 _ #(idc0)%expr_pat x5 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- match
- s2 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun v0 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x1 @ x'0 v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @ $v1)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s3 -> d3)%ptype =>
- fun
- _ : Compile.value' false s3 ->
- Compile.value' true d3 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x5)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s3 -> d3)%ptype =>
- fun
- _ : Compile.value' false s3 ->
- Compile.value' true d3 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s2 _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
- _ _ _ s2 _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s2 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s0 _ (_ @ _)%expr_pat _ =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x1 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s2 _ #(idc0)%expr_pat x6 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- match
- s2 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun v0 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x1 @ x'0 v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @ $v1)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s3 -> d3)%ptype =>
- fun
- _ : Compile.value' false s3 ->
- Compile.value' true d3 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x6)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s3 -> d3)%ptype =>
- fun
- _ : Compile.value' false s3 ->
- Compile.value' true d3 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s2 _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
- _ _ _ s2 _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s2 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x1 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ #(idc0)%expr_pat x6 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- match
- s1 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun v0 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x1 @ x'0 v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @ $v1)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x6)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s2 -> d2)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s1 _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
- _ _ _ s1 _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s1 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- if args0 <=? 0
- then
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x1 @ ##((- args0)%Z)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- (-
- (#(ident.snd)%expr @ $v0)%expr_pat)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ #(idc0)%expr_pat x5 =>
- match
- match idc0 with
- | ident.Z_opp => Some tt
- | _ => None
- end
- with
- | Some _ =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : defaults.expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (defaults.expr (type.base t2) ->
- defaults.expr (type.base base.type.Z))
- =>
- match a with
- | Some x' =>
- match
- s0 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t3 =>
- fun v0 : defaults.expr (type.base t3)
- =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- defaults.expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type ident
- var
- (defaults.expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a0 : option
- (defaults.expr
- (type.base t3) ->
- defaults.expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- UnderLets.UnderLet
- (#(ident.Z_sub_with_get_borrow)%expr @
- x @ x' v @ x1 @ x'0 v0)%expr_pat
- (fun
- v1 : var
- (type.base
- (base.type.Z *
- base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @
- ($v1)%expr,
- (-
- (#(ident.snd)%expr @ $v1)%expr_pat)%expr)%expr_pat)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @
- x @ x0 @ x1 @ x2)%expr_pat
- end (Compile.reflect x5)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @
- x0 @ x1 @ x2)%expr_pat
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
- _ _ _ s0 _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s0 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- end
- | None =>
- match x1 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- match x2 with
- | #(idc1)%expr_pat =>
- match
- match idc1 with
- | @ident.Literal t2 v =>
- match
- t2 as t3
- return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- ##(args)%expr @ ##(args0)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr, ##(0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- end
- | @expr.App _ _ _ s _ ($_)%expr _ =>
- match x1 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t1 v0 =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some args =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t2 v0 =>
- match
- t2 as t3 return (base.base_interp t3 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v1 : Z => Some v1
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v0
- | _ => None
- end
- with
- | Some args0 =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- ##(args)%expr @ ##(args0)%expr)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr, ##(0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v0 : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v1 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v1 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v1)%expr,
- #(ident.snd)%expr @ ($v1)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- end
- | @expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
- (_ @ _)%expr_pat _ | @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _)
- _ =>
- match x1 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- ##(args)%expr @ ##(args0)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr, ##(0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | _ =>
- match x1 with
- | #(idc)%expr_pat =>
- match
- match idc with
- | @ident.Literal t0 v =>
- match
- t0 as t1 return (base.base_interp t1 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args =>
- match x2 with
- | #(idc0)%expr_pat =>
- match
- match idc0 with
- | @ident.Literal t1 v =>
- match
- t1 as t2 return (base.base_interp t2 -> option Z)
- with
- | base.type.unit => fun _ : unit => None
- | base.type.Z => fun v0 : Z => Some v0
- | base.type.bool => fun _ : bool => None
- | base.type.nat => fun _ : nat => None
- end v
- | _ => None
- end
- with
- | Some args0 =>
- if (args =? 0) && (args0 =? 0)
- then
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
- ##(args)%expr @ ##(args0)%expr)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr, ##(0)%expr)%expr_pat)
- else
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @
- x2)%expr_pat
- (fun
- v : var
- (type.base
- (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
- end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v0 : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun
- v : var
- (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
+ | None => default
end
- | None =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype)
- =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
+ | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _ _ _ s0 _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0 _
+ (_ @ _)%expr_pat _ | @expr.App _ _ _ s0 _
+ (@expr.LetIn _ _ _ _ _ _ _) _ => default
+ | _ => default1 tt
end
- | ($_)%expr =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v0 : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v0)%expr,
- #(ident.snd)%expr @ ($v0)%expr)%expr_pat)
- | _ =>
- UnderLets.UnderLet
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
- (fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base
- (#(ident.fst)%expr @ ($v)%expr,
- #(ident.snd)%expr @ ($v)%expr)%expr_pat)
+ | None => default
end
+ | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _ (_ @ _)%expr_pat _ |
+ @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ => default
+ | _ => default0 tt
end
| ident.Z_sub_get_borrow =>
fun x x0 x1 : defaults.expr (type.base base.type.Z) =>
+ llet _ := UnderLets.Base
+ (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x1)%expr_pat in
UnderLets.UnderLet
(#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x1)%expr_pat
(fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
@@ -16671,6 +4954,8 @@ match idc in (ident t) return (Compile.value' true t) with
(#(ident.fst)%expr @ ($v)%expr, #(ident.snd)%expr @ ($v)%expr)%expr_pat)
| ident.Z_sub_with_get_borrow =>
fun x x0 x1 x2 : defaults.expr (type.base base.type.Z) =>
+ llet _ := UnderLets.Base
+ (#(ident.Z_sub_with_get_borrow)%expr @ x @ x0 @ x1 @ x2)%expr_pat in
UnderLets.UnderLet
(#(ident.Z_sub_with_get_borrow)%expr @ x @ x0 @ x1 @ x2)%expr_pat
(fun v : var (type.base (base.type.Z * base.type.Z)%etype) =>
@@ -16678,21 +4963,30 @@ match idc in (ident t) return (Compile.value' true t) with
(#(ident.fst)%expr @ ($v)%expr, #(ident.snd)%expr @ ($v)%expr)%expr_pat)
| ident.Z_zselect =>
fun x x0 x1 : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_zselect)%expr @ x @ x0 @ x1)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.Z_zselect)%expr @ x @ x0 @ x1)%expr_pat in
+ default
| ident.Z_add_modulo =>
fun x x0 x1 : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_add_modulo)%expr @ x @ x0 @ x1)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.Z_add_modulo)%expr @ x @ x0 @ x1)%expr_pat in
+ default
| ident.Z_rshi =>
fun x x0 x1 x2 : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_rshi)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.Z_rshi)%expr @ x @ x0 @ x1 @ x2)%expr_pat in
+ default
| ident.Z_cc_m =>
fun x x0 : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_cc_m)%expr @ x @ x0)%expr_pat
+ llet default := UnderLets.Base (#(ident.Z_cc_m)%expr @ x @ x0)%expr_pat in
+ default
| ident.Z_cast range =>
fun x : defaults.expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_cast range)%expr @ x)%expr_pat
+ llet default := UnderLets.Base (#(ident.Z_cast range)%expr @ x)%expr_pat in
+ default
| ident.Z_cast2 range =>
fun x : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
+ llet default := UnderLets.Base (#(ident.Z_cast2 range)%expr @ x)%expr_pat in
match x with
| @expr.App _ _ _ s _ (@expr.App _ _ _ s0 _ #(idc)%expr_pat x1) x0 =>
match
@@ -16755,88 +5049,103 @@ match idc in (ident t) return (Compile.value' true t) with
#(ident.Z_cast (snd range))%expr @
($(x'0 v0))%expr)%expr_pat;
UnderLets.Base (id (id fv)))%under_lets
- | None =>
- UnderLets.Base
- (#(ident.Z_cast2 range)%expr @ x)%expr_pat
+ | None => default
end)
| (s1 -> d1)%ptype =>
fun
_ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_cast2 range)%expr @ x)%expr_pat
+ Compile.value' true d1 => default
end (Compile.reflect x0)
- | None =>
- UnderLets.Base
- (#(ident.Z_cast2 range)%expr @ x)%expr_pat
+ | None => default
end)
| (s1 -> d1)%ptype =>
fun _ : Compile.value' false s1 -> Compile.value' true d1 =>
- UnderLets.Base (#(ident.Z_cast2 range)%expr @ x)%expr_pat
+ default
end (Compile.reflect x1)
- | None => UnderLets.Base (#(ident.Z_cast2 range)%expr @ x)%expr_pat
+ | None => default
end
| @expr.App _ _ _ s _ (@expr.App _ _ _ s0 _ ($_)%expr _) _ | @expr.App _
_ _ s _ (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _) _ | @expr.App
_ _ _ s _ (@expr.App _ _ _ s0 _ (_ @ _)%expr_pat _) _ | @expr.App _ _ _
- s _ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _) _ =>
- UnderLets.Base (#(ident.Z_cast2 range)%expr @ x)%expr_pat
+ s _ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _) _ => default
| @expr.App _ _ _ s _ #(_)%expr_pat _ | @expr.App _ _ _ s _ ($_)%expr _ |
@expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.Base (#(ident.Z_cast2 range)%expr @ x)%expr_pat
- | _ => UnderLets.Base (#(ident.Z_cast2 range)%expr @ x)%expr_pat
+ (@expr.LetIn _ _ _ _ _ _ _) _ => default
+ | _ => default
end
| ident.fancy_add log2wordmax imm =>
fun x : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base (#(ident.fancy_add log2wordmax imm)%expr @ x)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.fancy_add log2wordmax imm)%expr @ x)%expr_pat in
+ default
| ident.fancy_addc log2wordmax imm =>
fun
x : defaults.expr
(type.base (base.type.Z * base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base (#(ident.fancy_addc log2wordmax imm)%expr @ x)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.fancy_addc log2wordmax imm)%expr @ x)%expr_pat in
+ default
| ident.fancy_sub log2wordmax imm =>
fun x : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base (#(ident.fancy_sub log2wordmax imm)%expr @ x)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.fancy_sub log2wordmax imm)%expr @ x)%expr_pat in
+ default
| ident.fancy_subb log2wordmax imm =>
fun
x : defaults.expr
(type.base (base.type.Z * base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base (#(ident.fancy_subb log2wordmax imm)%expr @ x)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.fancy_subb log2wordmax imm)%expr @ x)%expr_pat in
+ default
| ident.fancy_mulll log2wordmax =>
fun x : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base (#(ident.fancy_mulll log2wordmax)%expr @ x)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.fancy_mulll log2wordmax)%expr @ x)%expr_pat in
+ default
| ident.fancy_mullh log2wordmax =>
fun x : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base (#(ident.fancy_mullh log2wordmax)%expr @ x)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.fancy_mullh log2wordmax)%expr @ x)%expr_pat in
+ default
| ident.fancy_mulhl log2wordmax =>
fun x : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base (#(ident.fancy_mulhl log2wordmax)%expr @ x)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.fancy_mulhl log2wordmax)%expr @ x)%expr_pat in
+ default
| ident.fancy_mulhh log2wordmax =>
fun x : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base (#(ident.fancy_mulhh log2wordmax)%expr @ x)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.fancy_mulhh log2wordmax)%expr @ x)%expr_pat in
+ default
| ident.fancy_rshi log2wordmax x =>
fun x0 : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base (#(ident.fancy_rshi log2wordmax x)%expr @ x0)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.fancy_rshi log2wordmax x)%expr @ x0)%expr_pat in
+ default
| ident.fancy_selc =>
fun
x : defaults.expr
(type.base (base.type.Z * base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base (#(ident.fancy_selc)%expr @ x)%expr_pat
+ llet default := UnderLets.Base (#(ident.fancy_selc)%expr @ x)%expr_pat in
+ default
| ident.fancy_selm log2wordmax =>
fun
x : defaults.expr
(type.base (base.type.Z * base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base (#(ident.fancy_selm log2wordmax)%expr @ x)%expr_pat
+ llet default := UnderLets.Base
+ (#(ident.fancy_selm log2wordmax)%expr @ x)%expr_pat in
+ default
| ident.fancy_sell =>
fun
x : defaults.expr
(type.base (base.type.Z * base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base (#(ident.fancy_sell)%expr @ x)%expr_pat
+ llet default := UnderLets.Base (#(ident.fancy_sell)%expr @ x)%expr_pat in
+ default
| ident.fancy_addm =>
fun
x : defaults.expr
(type.base (base.type.Z * base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base (#(ident.fancy_addm)%expr @ x)%expr_pat
+ llet default := UnderLets.Base (#(ident.fancy_addm)%expr @ x)%expr_pat in
+ default
end
: Compile.value' true t