module prob1 where open import Relation.Binary.PropositionalEquality open import Relation.Binary.Core open import Data.Nat open import Data.Nat.Properties open import logic open import nat open import Data.Empty open import Data.Product open import Relation.Nullary open import Relation.Binary.Definitions -- All variables are positive integer -- A = -M*n + i +k*M - M -- where n is in range (0,…,k-1) and i is in range(0,…,M-1) -- Goal: Prove that A can take all values of (0,…,k*M-1) -- A1 = -M*n1 + i1 +k*M M, A2 = -M*n2 + i2 +k*M - M -- (1) If n1!=n2 or i1!=i2 then A1!=A2 -- Or its contraposition: (2) if A1=A2 then n1=n2 and i1=i2 -- Proof by contradiction: Suppose A1=A2 and (n1!=n2 or i1!=i2) becomes -- contradiction -- Induction on n and i record Cond1 (A M k : ℕ ) : Set where field n : ℕ i : ℕ range-n : n < k range-i : i < M rule1 : i + k * M ≡ M * (suc n) + A -- A ≡ (i + k * M ) - (M * (suc n)) -- k = 1 → n = 0 → ∀ M → A = i -- k = 2 → n = 1 → -- i + 2 * M = M * (suc n) + A i = suc n → A = 0 problem : ( A M k : ℕ ) → Set problem A M k = (suc A < k * M ) → Cond1 A M k problem0-k=k : ( k A M : ℕ ) → problem A M k problem0-k=k zero A M () problem0-k=k (suc k) A zero A A ((k - n) ) * M ) → A - ((k - n) * M) < M → Cond1 A M (suc k) cck n n0 n (k - n) * M → Cond1 A M (suc k) cc zero n (k - n) * M lemma1 a=mk = subst (λ x → (k - n) * M < suc x ) (sym (a=mk0 a=mk )) a ¬a ¬b c = cc n (less-1 n M + (k - (suc n)) * M → A > M + (k - n) - M → A > (k - n) lemma3 : (A - ((k - (suc n)) * M)) > M → suc A > (k - n) * M lemma3 mk (k - k) * M start-range zero = s≤s z≤n start-range (suc k) = start-range k -- problem0 : ( A M k : ℕ ) → M > 0 → k > 0 → (suc A < k * M ) → Cond1 A M k -- problem0 A (suc M) (suc k) 0 ¬a ¬b c = no {!!} -- lemma1-i n (suc i) A ¬a ¬b c = no {!!} -- --- n loop -- lemma1 : ( n i : ℕ ) → (suc A < suc k * suc M ) → n < suc k → i < suc M → Cond1 A (suc M) (suc k) -- lemma1 n i A ¬a ¬b c = {!!} -- can't happen -- lemma1 (suc n) i A ¬a ¬b c = {!!} where -- can't happen -- cannot1 : { n k M i A : ℕ } → n < suc k → i < suc M → (i + suc k * suc M ) > ( suc M * suc n + A) → ¬ ( suc A < suc k * suc M ) -- cannot1 = {!!} -- range-n : n < k -- range-i : i < M -- rule1 : i + k * M ≡ M * (suc n) + A -- A ≡ (i + k * M ) - (M * (suc n)) problem1-0 : (A M k : ℕ ) → (x : suc A < k * M ) → (c1 : Cond1 A M k ) → Cond1.i c1 ≡ Cond1.i (problem0-k=k k A M x) problem1-0 A (suc m) (suc k) x c1 = {!!} where -- cc k a ((k - n) ) * M ) → A - ((k - n) * M) < M → ( Cond1.i c1 ≡ Cond1.i (problem0-k=k k A M {!!}) ) cck n n (k - n) * M → ( Cond1.i c1 ≡ Cond1.i (problem0-k=k k A M {!!}) ) cc zero n ¬a ¬b c = {!!} start-range : (k : ℕ ) → suc A > (k - k) * M start-range zero = s≤s z≤n start-range (suc k) = start-range k