| import Lean.Expr | |
| open Lean | |
| def tst1 : IO Unit := | |
| do let f := mkConst `f []; | |
| let a := mkConst `a []; | |
| let b := mkConst `b []; | |
| let t := mkAppN f #[a, b, b]; | |
| let as₁ := t.getAppArgs; | |
| let as₂ := t.getAppRevArgs; | |
| IO.println as₁; | |
| IO.println as₂; | |
| unless as₁.reverse == as₂ do throw $ IO.userError "failed"; | |
| pure () | |
| /-- | |
| info: #[a, b, b] | |
| #[b, b, a] | |
| -/ | |
| #guard_msgs in | |
| #eval tst1 | |
| def tst2 : IO Unit := | |
| do let l1 := mkLevelMax (mkLevelParam `a) (mkLevelParam `b); | |
| let l2 := mkLevelMax (mkLevelParam `b) (mkLevelParam `a); | |
| IO.println l1; | |
| IO.println l2; | |
| unless Level.isEquiv l1 l2 do throw $ IO.userError "not equiv"; | |
| pure () | |
| /-- | |
| info: max a b | |
| max b a | |
| -/ | |
| #guard_msgs in | |
| #eval tst2 | |
| def tst3 : IO Unit := | |
| do let f := mkConst `f []; | |
| let a := mkConst `a []; | |
| let b := mkConst `b []; | |
| let c := mkConst `c []; | |
| let t := mkAppN f #[a, b, c]; | |
| IO.println $ t.getArg! 0; | |
| IO.println $ t.getArg! 1; | |
| IO.println $ t.getArg! 2; | |
| pure () | |
| /-- | |
| info: a | |
| b | |
| c | |
| -/ | |
| #guard_msgs in | |
| #eval tst3 | |
| def tst4 : IO Unit := | |
| do let f := mkConst `f []; | |
| let a := mkConst `a []; | |
| let b := mkConst `b []; | |
| let x0 := mkBVar 0; | |
| let x1 := mkBVar 1; | |
| let t1 := mkAppN f #[a, b]; | |
| let t2 := mkAppN f #[a, x0]; | |
| let t3 := mkLambda `x BinderInfo.default (mkSort Level.zero) (mkAppN f #[a, x0]); | |
| let t4 := mkLambda `x BinderInfo.default (mkSort Level.zero) (mkAppN f #[a, x1]); | |
| unless (!t1.hasLooseBVar 0) do throw $ IO.userError "failed-1"; | |
| unless (t2.hasLooseBVar 0) do throw $ IO.userError "failed-2"; | |
| unless (!t3.hasLooseBVar 0) do throw $ IO.userError "failed-3"; | |
| unless (t4.hasLooseBVar 0) do throw $ IO.userError "failed-4"; | |
| unless (!t4.hasLooseBVar 1) do throw $ IO.userError "failed-5"; | |
| unless (!t2.hasLooseBVar 1) do throw $ IO.userError "failed-6"; | |
| pure () | |
| #guard_msgs in | |
| #eval tst4 | |
| def tst5 : IO Unit := | |
| do let f := mkConst `f []; | |
| let a := mkConst `a []; | |
| let nat := mkConst `Nat []; | |
| let x0 := mkBVar 0; | |
| let x1 := mkBVar 1; | |
| let x2 := mkBVar 2; | |
| let t := mkLambda `x BinderInfo.default nat (mkApp f x0); | |
| IO.println t.etaExpanded?; | |
| unless (t.etaExpanded? == some f) do throw $ IO.userError "failed-1"; | |
| let t := mkLambda `x BinderInfo.default nat (mkApp f x1); | |
| unless (t.etaExpanded? == none) do throw $ IO.userError "failed-2"; | |
| let t := mkLambda `x BinderInfo.default nat (mkAppN f #[a, x0]); | |
| unless (t.etaExpanded? == some (mkApp f a)) do throw $ IO.userError "failed-3"; | |
| let t := mkLambda `x BinderInfo.default nat (mkAppN f #[x0, x0]); | |
| unless (t.etaExpanded? == none) do throw $ IO.userError "failed-4"; | |
| let t := mkLambda `x BinderInfo.default nat (mkLambda `y BinderInfo.default nat (mkApp f x0)); | |
| unless (t.etaExpanded? == none) do throw $ IO.userError "failed-5"; | |
| let t := mkLambda `x BinderInfo.default nat (mkLambda `y BinderInfo.default nat (mkAppN f #[x1, x0])); | |
| IO.println t; | |
| unless (t.etaExpanded? == some f) do throw $ IO.userError "failed-6"; | |
| let t := mkLambda `x BinderInfo.default nat (mkLambda `y BinderInfo.default nat (mkLambda `z BinderInfo.default nat (mkAppN f #[x2, x1, x0]))); | |
| IO.println t; | |
| unless (t.etaExpanded? == some f) do throw $ IO.userError "failed-7"; | |
| let t := mkLambda `x BinderInfo.default nat (mkLambda `y BinderInfo.default nat (mkLambda `z BinderInfo.default nat (mkAppN f #[a, x2, x1, x0]))); | |
| IO.println t; | |
| unless (t.etaExpanded? == some (mkApp f a)) do throw $ IO.userError "failed-8"; | |
| IO.println t.etaExpanded?; | |
| let t := mkApp f a; | |
| unless (t.etaExpanded? == some (mkApp f a)) do throw $ IO.userError "failed-9"; | |
| pure () | |
| /-- | |
| info: (some f) | |
| fun (x : Nat) (y : Nat) => f x y | |
| fun (x : Nat) (y : Nat) (z : Nat) => f x y z | |
| fun (x : Nat) (y : Nat) (z : Nat) => f a x y z | |
| (some (f a)) | |
| -/ | |
| #guard_msgs in | |
| #eval tst5 | |
| def tst6 : IO Unit := do | |
| let x1 := mkBVar 0; | |
| let x2 := mkBVar 1; | |
| let t1 := mkApp2 (mkConst `f) x1 x2; | |
| let t2 := mkForall `x BinderInfo.default (mkConst `Nat) t1; | |
| IO.println (t1.liftLooseBVars 0 1); | |
| IO.println (t2.liftLooseBVars 0 1); | |
| let t3 := (t2.liftLooseBVars 0 1).lowerLooseBVars 1 1; | |
| IO.println $ t3; | |
| unless (t2 == t3) do throw $ IO.userError "failed-1"; | |
| pure () | |
| /-- | |
| info: f #1 #2 | |
| forall (x : Nat), f x #1 | |
| forall (x : Nat), f x #0 | |
| -/ | |
| #guard_msgs in | |
| #eval tst6 | |
| instance : Coe Name FVarId where | |
| coe n := { name := n } | |
| def tst7 : IO Unit := do | |
| let x := mkFVar `x; | |
| let y := mkFVar `y; | |
| let f := mkConst `f; | |
| let t := mkAppN f #[x, y, mkNatLit 2]; | |
| let t := t.abstract #[x, y]; | |
| let t := t.instantiateRev #[mkNatLit 0, mkNatLit 1]; | |
| IO.println t | |
| /-- | |
| info: f (OfNat.ofNat.{0} Nat 0 (instOfNatNat 0)) (OfNat.ofNat.{0} Nat 1 (instOfNatNat 1)) (OfNat.ofNat.{0} Nat 2 (instOfNatNat 2)) | |
| -/ | |
| #guard_msgs in | |
| #eval tst7 |