Forcing4.agda 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. module Forcing4 where
  2. open import Common.Nat renaming (zero to Z; suc to S)
  3. open import Lib.Fin
  4. open import Common.Equality
  5. open import Common.String
  6. open import Common.IO
  7. open import Common.Unit
  8. Rel : (X : Set) → Set1
  9. Rel X = X → X → Set
  10. data _<=_ : Rel Nat where
  11. z<=n : ∀ n → Z <= n -- n is forced
  12. s<=s : ∀ m n (m<=n : m <= n) → S m <= S n -- m and n are forced
  13. _ℕ<_ : Rel Nat
  14. m ℕ< n = S m <= n
  15. fromℕ≤ : ∀ {m n} → m ℕ< n → Fin n
  16. fromℕ≤ (s<=s .0 n (z<=n .n) ) = fz {n}
  17. fromℕ≤ (s<=s .(S m) .(S n) (s<=s m n m<=n)) = fs {S n} (fromℕ≤ (s<=s m n m<=n))
  18. fromℕ≤-toℕ : ∀ m (i : Fin m) (i<m : forget i ℕ< m) → fromℕ≤ i<m ≡ i
  19. fromℕ≤-toℕ .(S n) (fz {n}) (s<=s .0 .n (z<=n .n)) = refl
  20. fromℕ≤-toℕ .(S (S n)) (fs .{S n} y) (s<=s .(S (forget y)) .(S n) (s<=s .(forget y) n m≤n)) = cong (\ n → fs n) (fromℕ≤-toℕ (S n) y (s<=s (forget y) n m≤n))
  21. [_/2] : Nat → Nat
  22. [ 0 /2] = 0
  23. [ 1 /2] = 0
  24. [ S (S n) /2] = S [ n /2]
  25. [1/2]-mono : (m n : Nat) → m <= n → [ m /2] <= [ n /2]
  26. [1/2]-mono .0 .n (z<=n n) = z<=n [ n /2]
  27. [1/2]-mono .1 .(S n) (s<=s .0 .n (z<=n n)) = z<=n [ S n /2]
  28. [1/2]-mono .(S (S m)) .(S (S n)) (s<=s .(S m) .(S n) (s<=s m n m<=n)) = s<=s [ m /2] [ n /2] ([1/2]-mono m n m<=n)
  29. showEq : {X : Set}{A : X} → A ≡ A → String
  30. showEq refl = "refl"
  31. show<= : {m n : Nat} → m <= n → String
  32. show<= (z<=n n) = "0 <= " +S+ natToString n
  33. show<= (s<=s m n m<=n) = natToString (S m) +S+ " <= " +S+ natToString (S n)
  34. data Bot : Set where
  35. -- Only to check that it compiles..
  36. foo : (n : Nat) → S n <= n → Bot
  37. foo .(S n) (s<=s .(S n) n le) = foo n le
  38. main : IO Unit
  39. main = putStrLn (showEq (fromℕ≤-toℕ 3 (inc (inject 1)) le)) ,,
  40. putStrLn (show<= ([1/2]-mono 4 6 le'))
  41. where
  42. le : 2 <= 3
  43. le = s<=s _ _ (s<=s _ _ (z<=n _))
  44. le' : 4 <= 6
  45. le' = s<=s _ _ (s<=s _ _ (s<=s _ _ (s<=s _ _ (z<=n _))))