{-# 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.