\module Logic.Meta

contradiction

This meta will try to derive a contradiction from the context if no arguments are specified. Implicit using, usingOnly and hiding (description of these metas can be found here) arguments can be used to modify the context it uses. Examples (requires arend-lib):

\import Logic.Meta
\import Logic
\import Meta
\import Order.StrictOrder
\import Set

\lemma equality {x y : Nat} (p : x = y) (q : Not (x = y)) : Empty
  => contradiction

\lemma irreflexivity {A : Set#} {x y : A} (p : x # x) : Empty
  => contradiction

\lemma irreflexivity2 {A : Set#} {x y : A} (p : x # y) (q : x = y) : Empty
  => contradiction

\lemma irreflexivity3 {A : StrictPoset} {x y z : A} (p : x < y) (q : x = z) (s : y = z) : Empty
  => contradiction

\lemma usingTest (P Q : \Prop) (q : Q) (e : P -> Empty) (p : P) : Empty
  => contradiction {usingOnly (e,p)}

\lemma transTest {A : LinearOrder} {x y z u v w : A}
  (p : x < y) (q : y = z) (a : z <= u) (b : u = v) (c : v < w) (d : w <= x)
  : Empty
  => contradiction

It can also be specified with an implicit argument which itself is a contradiction. Examples:

\lemma explicitProof (P : \Prop) (e : Empty) : P
  => contradiction {e}

\lemma explicitProof2 (P : \Prop) (e : P -> Not P) (p : P) : Empty
  => contradiction {e}

Exists

The alias of this meta is , which is convenient to read.

  • Exists {x y z} B is equivalent to TruncP (\Sigma (x y z : _) B).
  • Exists (x y z : A) B is equivalent to TruncP (\Sigma (x y z : A) B).

Examples:

\lemma test1 := (\Sigma) => idp

\lemma test2 : ∃ Nat = TruncP Nat => idp

\lemma test3 : ∃ (x : Nat) (x = 0) = TruncP (\Sigma (x : Nat) (x = 0)) => idp

\lemma test4 : ∃ {x} (x = 0) = TruncP (\Sigma (x : Nat) (x = 0)) => idp

\lemma test5 : ∃ {x y} (x = 0) = TruncP (\Sigma (x y : Nat) (x = 0)) => idp

If the argument of is a predicate, it will be treated as a subset:

\lemma test7 (P : Nat -> \Type)
  : ∃ P
  = TruncP (\Sigma (x : Nat) (P x))
  => idp

\lemma test8 (P : Nat -> Nat -> \Type)
  : ∃ P
  = TruncP (\Sigma (x y : Nat) (P x y))
  => idp

\lemma test9 (P : Nat -> \Type)
  : ∃ (x : P) (x = x)
  = TruncP (\Sigma (x : Nat) (P x) (x = x))
  => idp

\lemma test10 (P : Nat -> \Type)
  : ∃ (x y : P) (x = y) (y = x)
  = TruncP (\Sigma (x y : Nat) (P x) (P y) (x = y) (y = x))
  => idp

\lemma test11 (P : Nat -> Bool -> Array Nat -> \Type)
  : ∃ ((x,y,z) (a,b,c) : P) (x = a) (y = b) (z = c)
  = TruncP (\Sigma (x a : Nat) (y b : Bool) (z c : Array Nat) (P x y z) (P a b c) (x = a) (y = b) (z = c))
  => idp

If the argument of is an array, it will be treated as a set of its elements:

\lemma test12 (l : Array Nat)
  : ∃ l
  = TruncP (Fin l.len)
  => idp

\lemma test13 {A : \Type} (y : A) (l : Array A)
  : ∃ (x : l) (x = y)
  = TruncP (\Sigma (j : Fin l.len) (l j = y))
  => idp

\lemma test14 {A : \Type} (l : Array A)
  : ∃ (x y : l) (x = y)
  = TruncP (\Sigma (j j' : Fin l.len) (l j = l j'))
  => idp

Given

This meta has the same syntax as Exists, but returns an untruncated \Sigma-expression.

\func sigmaTest : Given (x : Nat) (x = 0) = (\Sigma (x : Nat) (x = 0)) => idp

Forall

The alias of this meta is . This meta has a similar syntax to Exists, but returns a \Pi-expression.

\lemma piTest1 : ∀ (x y : Nat) (x = y) = (\Pi (x y : Nat) -> x = y) => idp

\lemma piTest2 : ∀ {x y : Nat} (x = y) = (\Pi {x y : Nat} -> x = y) => idp

\lemma piTest3
  : ∀ x y (pos x = y)
  = (\Pi (x : Nat) (y : Int) -> pos x = y)
  => idp

\lemma piTest4
  : ∀ {x y} {z} (pos x = z)
  = (\Pi {x y : Nat} {z : Int} -> pos x = z)
  => idp

\lemma piTest5 (P : Nat -> \Type)
  : ∀ (x y : P) (x = y) (y = x)
  = (\Pi (x y : Nat) (P x) (P y) -> x = y -> y = x)
  => idp

\lemma piTest6 (P : Nat -> \Type)
  : ∀ {x y : P} (x = y) (y = x)
  = (\Pi {x y : Nat} (P x) (P y) -> x = y -> y = x)
  => idp

\lemma piTest7 {A : \Set} (l : Array A)
  : ∀ (x y : l) (x = y) (y = x)
  = (\Pi (j j' : Fin l.len) -> l j = l j' -> l j' = l j)
  => idp

\lemma piTest8 (P : Nat -> Bool -> Array Nat -> \Type)
  : ∀ ((x,y,z) (a,b,c) : P) (x = a) (y = b) (z = c)
  = (\Pi (x a : Nat) (y b : Bool) (z c : Array Nat) -> P x y z -> P a b c -> x = a -> y = b -> z = c)
  => idp

constructor

Returns either a tuple, a \new expression, or a single constructor of a data type depending on the expected type.

\func tuple0 : \Sigma (\Sigma) (\Sigma) => constructor constructor constructor

\func tuple1 : \Sigma Nat Nat => constructor 0 1

\func tuple2 : \Sigma (x : Nat) (p : x = 0) => constructor 0 idp

\func data2 : D => constructor 0 1 2
  \where
    \data D | con {x : Nat} (y z : Nat)

\record R (x : Nat) (y : Nat) (z : Nat)

\func class1 : R => constructor 1 2 3

\func class2 : R 1 => constructor 2 3