| #print "---- Op" | |
| inductive Op : Nat → Nat → Type | |
| | mk : ∀ n, Op n n | |
| structure Node : Type where | |
| id₁ : Nat | |
| id₂ : Nat | |
| o : Op id₁ id₂ | |
| def h1 (x : List Node) : Bool := | |
| match x with | |
| | _ :: Node.mk 0 _ (Op.mk _) :: _ => true | |
| | _ => false | |
| def mkNode (n : Nat) : Node := { id₁ := n, id₂ := n, o := Op.mk _ } | |
| #eval h1 [mkNode 1, mkNode 0, mkNode 3] | |
| #eval h1 [mkNode 1, mkNode 1, mkNode 3] | |
| #eval h1 [mkNode 0] | |
| #eval h1 [] | |
| #print "---- Foo 1" | |
| inductive Foo : Bool → Type | |
| | bar : Foo false | |
| | baz : Foo false | |
| def h2 {b : Bool} (x : Foo b) : Bool := | |
| match b, x with | |
| | _, Foo.bar => true | |
| | _, Foo.baz => false | |
| #eval h2 Foo.bar | |
| #eval h2 Foo.baz | |
| def h2' {b : Bool} (x : Foo b) : Bool := | |
| match x with | |
| | Foo.bar => true | |
| | Foo.baz => false | |
| #print "---- Foo 2" | |
| def h3 {b : Bool} (x : Foo b) : Bool := | |
| match b, x with | |
| | _, Foo.bar => true | |
| | _, _ => false | |
| #eval h3 Foo.bar | |
| #eval h3 Foo.baz | |
| #print "---- Op 2" | |
| def h4 (x : List Node) : Bool := | |
| match x with | |
| | _ :: ⟨1, 1, Op.mk _⟩ :: _ => true | |
| | _ => false | |
| #eval h4 [mkNode 1, mkNode 0, mkNode 3] | |
| #eval h4 [mkNode 1, mkNode 1, mkNode 3] | |
| #eval h4 [mkNode 0] | |
| #eval h4 [] | |
| #print "---- Foo 3" | |
| set_option pp.all true | |
| def h5 {b : Bool} (x : Foo b) : Bool := | |
| match b, x with | |
| | _, Foo.bar => true | |
| | c, y => false | |
| def h5' {b : Bool} (x : Foo b) : Bool := | |
| match x with | |
| | Foo.bar => true | |
| | y => false | |
| def h6 {b : Bool} (x : Foo b) : Bool := | |
| match b, x with | |
| | _, Foo.bar => true | |
| | b, x => false | |
| def h6' {b : Bool} (x : Foo b) : Bool := | |
| match (generalizing := true) (motive := (b : Bool) → Foo b → Bool) b, x with | |
| | _, Foo.bar => true | |
| | b, x => false | |
| def h6'' {b : Bool} (x : Foo b) : Bool := | |
| match (generalizing := false) (motive := (b : Bool) → Foo b → Bool) b, x with | |
| | _, Foo.bar => true | |
| | b, x => false |