4 | module Data.ProofDelay
7 | import Data.List.Quantifiers
14 | record PDelay (x : Type) where
21 | prove : HList goals -> x
26 | pure : tx -> PDelay tx
27 | pure x = Prf [] (const x)
31 | later : {tx : _} -> PDelay tx
32 | later = Prf (tx :: []) (\(x :: []) => x)
37 | (<*>) : PDelay (a -> b) -> PDelay a -> PDelay b
38 | (Prf goals1 prove1) <*> (Prf goals2 prove2) =
39 | Prf (goals1 ++ goals2) $
\hl =>
40 | let (left , right) = splitAt _ hl in
41 | prove1 left (prove2 right)
51 | data OList : (m, n : Nat) -> Type where
52 | Nil : (m `LTE` n) -> OList m n
53 | Cons : (x : Nat) -> (m `LTE` x) -> OList x n -> OList m n
59 | data BST : (m, n : Nat) -> Type where
60 | Leaf : (m `LTE` n) -> BST m n
61 | Branch : (x : Nat) -> (l : BST m x) -> (r : BST x n) -> BST m n
67 | nil : {m, n : Nat} -> PDelay (OList m n)
68 | nil = [| Nil later |]
72 | cons : {m, n : Nat} -> (x : Nat) -> PDelay (OList x n) -> PDelay (OList m n)
76 | in [| cx later xs |]
84 | structure = 1 `cons` (2 `cons` (3 `cons` (4 `cons` (5 `cons` nil))))
87 | proofs = LTESucc LTEZero
89 | :: LTESucc (LTESucc LTEZero)
90 | :: LTESucc (LTESucc (LTESucc LTEZero))
91 | :: LTESucc (LTESucc (LTESucc (LTESucc LTEZero)))
92 | :: LTESucc (LTESucc (LTESucc (LTESucc (LTESucc LTEZero))))
95 | in structure.prove proofs
101 | leaf : {m, n : Nat} -> PDelay (BST m n)
102 | leaf = [| Leaf later |]
106 | branch : {m, n : Nat}
108 | -> (l : PDelay (BST m x))
109 | -> (r : PDelay (BST x n))
110 | -> PDelay (BST m n)
119 | example2 : BST 2 10
122 | structure = branch 3
123 | (branch 2 leaf leaf)
125 | (branch 4 leaf leaf)
126 | (branch 10 leaf leaf))
131 | proofs = the ( 2 `LTE` 2) %search
132 | :: the ( 2 `LTE` 3) %search
133 | :: the ( 3 `LTE` 4) %search
134 | :: the ( 4 `LTE` 5) %search
135 | :: the ( 5 `LTE` 10) %search
136 | :: the (10 `LTE` 10) %search
148 | in structure.prove proofs