{-# OPTIONS --allow-unsolved-metas #-} module exercises3 where -- Propositions as types: simple exercises for lecture 3. -- Same style as test5.agda, but each one is a few symbols. -- Fill the holes (C-c C-l to load, C-c C-, to see the goal, C-c C-space to -- give a term, C-c C-c to split on a variable). Solutions: exercises3-sol.agda ------------------------------------------------------------------------ -- Implication: a proof of P → Q is a function ------------------------------------------------------------------------ -- P ⇒ P ex1 : {P : Set} → P → P ex1 x = {!!} -- P ⇒ Q ⇒ P ex2 : {P Q : Set} → P → Q → P ex2 x y = {!!} -- modus ponens ex3 : {P Q : Set} → P → (P → Q) → Q ex3 x f = {!!} -- transitivity of ⇒ : composition of functions ex4 : {P Q R : Set} → (P → Q) → (Q → R) → P → R ex4 f g x = {!!} -- swapping two hypotheses ex5 : {P Q R : Set} → (P → Q → R) → Q → P → R ex5 f y x = {!!} -- a hypothesis used twice ex6 : {P Q : Set} → (P → P → Q) → P → Q ex6 f x = {!!} ------------------------------------------------------------------------ -- Negation: ¬ P is P → ⊥ ------------------------------------------------------------------------ data ⊥ : Set where ¬ : Set → Set ¬ P = P → ⊥ -- from ⊥ everything follows: pattern matching with no cases ex7 : {P : Set} → ⊥ → P ex7 () -- P ⇒ ¬ ¬ P ex8 : {P : Set} → P → ¬ (¬ P) ex8 x k = {!!} -- contraposition ex9 : {P Q : Set} → (P → Q) → ¬ Q → ¬ P ex9 f k x = {!!} -- three negations are as good as one ex10 : {P : Set} → ¬ (¬ (¬ P)) → ¬ P ex10 k x = {!!} -- ¬ (P ∧ ¬ P), with ∧ as two hypotheses ex11 : {P : Set} → P → ¬ P → ⊥ ex11 x k = {!!} ------------------------------------------------------------------------ -- Conjunction: a pair. Disjunction: inl or inr ------------------------------------------------------------------------ record _×_ (P Q : Set) : Set where constructor _,_ field fst : P snd : Q open _×_ data _+_ (P Q : Set) : Set where inl : P → P + Q inr : Q → P + Q -- P ∧ Q ⇒ Q ∧ P ex12 : {P Q : Set} → P × Q → Q × P ex12 (x , y) = {!!} -- P ∧ Q ⇒ P ex13 : {P Q : Set} → P × Q → P ex13 (x , y) = {!!} -- currying: (P ∧ Q ⇒ R) ⇒ (P ⇒ Q ⇒ R), and back ex14 : {P Q R : Set} → (P × Q → R) → P → Q → R ex14 f x y = {!!} ex15 : {P Q R : Set} → (P → Q → R) → P × Q → R ex15 f (x , y) = {!!} -- P ⇒ P ∨ Q ex16 : {P Q : Set} → P → P + Q ex16 x = {!!} -- P ∨ Q ⇒ Q ∨ P : a proof by cases ex17 : {P Q : Set} → P + Q → Q + P ex17 (inl x) = {!!} ex17 (inr y) = {!!} -- (P ⇒ R) ∧ (Q ⇒ R) ⇒ (P ∨ Q ⇒ R) ex18 : {P Q R : Set} → (P → R) × (Q → R) → P + Q → R ex18 (f , g) (inl x) = {!!} ex18 (f , g) (inr y) = {!!} -- de Morgan: ¬ (P ∨ Q) ⇒ ¬ P ∧ ¬ Q ex19 : {P Q : Set} → ¬ (P + Q) → ¬ P × ¬ Q ex19 k = {!!} -- distributivity ex20 : {P Q R : Set} → P × (Q + R) → (P × Q) + (P × R) ex20 (x , inl y) = {!!} ex20 (x , inr z) = {!!} -- What about the converses? ¬ P ∧ ¬ Q ⇒ ¬ (P ∨ Q) is fine. -- ¬ (P ∧ Q) ⇒ ¬ P ∨ ¬ Q, and ¬ ¬ P ⇒ P, cannot be proved: a proof of -- ¬ P + ¬ Q would have to say which one, and we have nothing to decide it with.