gt22

Untitled

Oct 27th, 2024
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.16 KB | None | 0 0
  1. \import Data.List
  2. \import Equiv
  3. \import Paths
  4. \import Paths.Meta
  5.  
  6. \data Tree : \Set
  7. | leaf (n : Nat)
  8. | node (t : List Tree) \with {
  9. | nil => leaf 0
  10. | leaf n :: nil => leaf (suc n)
  11. }
  12.  
  13. \func tsuc (a : Tree) => node (a :: nil)
  14.  
  15. \func add (a b : Tree): Tree \elim b
  16. | leaf 0 => a
  17. | leaf (suc n) => tsuc (add a (leaf n))
  18. | node (n :: nil) => tsuc (add a n)
  19. | node (n :: n' :: ns) => node (add_list a (n :: n' :: ns))
  20. \where {
  21. \func add_list (a : Tree) (b : List Tree) : List Tree \elim b
  22. | nil => nil
  23. | b :: bs => add a b :: add_list a bs
  24. }
  25.  
  26. \func add-assoc {a b c : Tree} : add a (add b c) = add (add a b) c \elim c
  27. | leaf 0 => idp
  28. | leaf (suc n) => pmap tsuc add-assoc
  29. | node (n :: nil) => pmap tsuc add-assoc
  30. | node (n :: n' :: ns) => rewrite (add-assoc, add-assoc, add_list-assoc) idp
  31. \where {
  32. \func add_list-assoc {a b : Tree} {cs : List Tree}
  33. : add.add_list a (add.add_list b cs) = add.add_list (add a b) cs \elim cs
  34. | nil => idp
  35. | c :: cs => pmap2 (::) add-assoc add_list-assoc
  36. }
  37.  
  38.  
  39. \data Tree'
  40. | node' (List Tree')
  41.  
  42. \func zro' : Tree' => node' nil
  43.  
  44. \func suc' (n : Tree') : Tree' => node' (n :: nil)
  45.  
  46. \func add' (a b : Tree') : Tree' \elim b
  47. | node' nil => a
  48. | node' bs => node' (add_list' a bs)
  49. \where {
  50. \func add_list' (a : Tree') (b : List Tree') : List Tree' \elim b
  51. | nil => nil
  52. | b :: bs => add' a b :: add_list' a bs
  53. }
  54.  
  55. \func Tree_to_Tree' (t : Tree) : Tree' \elim t
  56. | leaf 0 => zro'
  57. | leaf (suc n) => suc' (Tree_to_Tree' (leaf n))
  58. | node (t :: nil) => suc' (Tree_to_Tree' t)
  59. | node (t :: t' :: ts) => node' (mut_list (t :: t' :: ts))
  60. \where {
  61. \func mut_list (ts : List Tree) : List Tree' \elim ts
  62. | nil => nil
  63. | t :: ts => Tree_to_Tree' t :: mut_list ts
  64.  
  65. \func eq (t : Tree) : Tree'_to_Tree (Tree_to_Tree' t) = t \elim t
  66. | leaf 0 => idp
  67. | leaf (suc n) => rewrite eq idp
  68. | node (t :: nil) => rewrite eq idp
  69. | node (t :: t' :: ts) => rewrite (eq, eq, mut_list-eq) idp
  70.  
  71. \func mut_list-eq (ts : List Tree) : Tree'_to_Tree.mut_list (mut_list ts) = ts \elim ts
  72. | nil => idp
  73. | _ :: _ => rewrite (eq, mut_list-eq) idp
  74. }
  75.  
  76. \func Tree'_to_Tree (t : Tree') : Tree \elim t
  77. | node' ts => node (mut_list ts)
  78. \where {
  79. \func mut_list (ts : List Tree') : List Tree \elim ts
  80. | nil => nil
  81. | t :: ts => Tree'_to_Tree t :: mut_list ts
  82.  
  83. \func eq (t : Tree') : Tree_to_Tree' (Tree'_to_Tree t) = t \elim t
  84. | node' nil => idp
  85. | node' (t :: nil) => rewrite eq idp
  86. | node' (t :: t' :: ns) => rewrite (eq, eq, mut_list-eq) idp
  87.  
  88. \func mut_list-eq (ts : List Tree') : Tree_to_Tree'.mut_list (mut_list ts) = ts \elim ts
  89. | nil => idp
  90. | _ :: _ => rewrite (eq, mut_list-eq) idp
  91. }
  92.  
  93. \func Tree-eq : QEquiv {Tree} {Tree'} \cowith
  94. | f => Tree_to_Tree'
  95. | ret => Tree'_to_Tree
  96. | ret_f => Tree_to_Tree'.eq
  97. | f_sec => Tree'_to_Tree.eq
  98.  
  99.  
  100. \func add-preserved (a b : Tree) : add' (Tree_to_Tree' a) (Tree_to_Tree' b) = Tree_to_Tree' (add a b) \elim b
  101. | leaf 0 => idp
  102. | leaf (suc n) => rewrite add-preserved idp
  103. | node (b :: nil) => rewrite add-preserved idp
  104. | node (b :: b' :: bs) => rewrite (add-preserved, add-preserved, add_list-preserved) idp
  105. \where {
  106. \func add_list-preserved (a : Tree) (bs : List Tree)
  107. : add'.add_list' (Tree_to_Tree' a) (Tree_to_Tree'.mut_list bs) = Tree_to_Tree'.mut_list (add.add_list a bs) \elim bs
  108. | nil => idp
  109. | b :: bs => rewrite (add-preserved, add_list-preserved) idp
  110. }
  111.  
  112. \func add'-assoc {a b c : Tree'} : add' a (add' b c) = add' (add' a b) c \elim c
  113. | node' nil => idp
  114. | node' (c :: cs) => rewrite (add'-assoc, add_list'-assoc) idp
  115. \where {
  116. \func add_list'-assoc (a b : Tree') (cs : List Tree') : add'.add_list' a (add'.add_list' b cs) = add'.add_list' (add' a b) cs \elim cs
  117. | nil => idp
  118. | c :: cs => rewrite (add'-assoc, add_list'-assoc) idp
  119. }
  120.  
  121. \func add-assoc' {a b c : Tree} : add a (add b c) = add (add a b) c
  122. => rewriteI (Tree-eq.ret_f, add-preserved, add-preserved) (rewrite (add'-assoc, add-preserved, add-preserved, Tree-eq.ret_f) idp)
Advertisement
Add Comment
Please, Sign In to add comment