packages feed

ivor-0.1.5: lib/lt.tt

Load "basics.tt";

Data le : (m,n:Nat)* =
    leO : (n:_)(le O n)
  | leS : (m,n:_)(p:le m n)(le (S m) (S n));

Match leSuc : (m,n:Nat)(p:le m n)(le m (S n)) =
    leSuc _ _ (leO _) = leO _
  | leSuc _ _ (leS _ _ p) = leS _ _ (leSuc _ _ p);

Match leSym : (m:Nat)(le m m) =
    leSym O = leO _
  | leSym (S k) = leS _ _ (leSym k);

Match lePlus : (m,n:Nat)(le m (plus m n)) =
    lePlus O n = leO _
  | lePlus (S k) n = leS _ _ (lePlus k n);

Data Compare : (m,n:Nat)* =
    cmpLT : (k,m:Nat)(Compare m (plus m (S k)))
  | cmpEQ : (n:Nat)(Compare n n)
  | cmpGT : (k,n:Nat)(Compare (plus n (S k)) n);

Match Partial compareAux : (m,n:Nat)(Compare m n)->(Compare (S m) (S n)) =
    compareAux _ _ (cmpLT k _) = cmpLT k _
  | compareAux _ _ (cmpEQ n) = cmpEQ _
  | compareAux _ _ (cmpGT k _) = cmpGT k _;

Match compare : (m,n:Nat)(Compare m n) =
    compare O (S k) = cmpLT _ O
  | compare O O = cmpEQ _
  | compare (S k) O = cmpGT _ O
  | compare (S x) (S y) = compareAux _ _ (compare x y);

Match mkLTaux : (m,n:Nat)(Compare m n)->(Maybe (le m n)) =
    mkLTaux _ _ (cmpLT k m) = just _ (lePlus m (S k))
  | mkLTaux _ _ (cmpEQ m) = just _ (leSym m)
  | mkLTaux _ _ (cmpGT k m) = nothing _;

mkLT = [m,n:Nat](mkLTaux _ _ (compare m n));

isBounded : (n,min,max:Nat)(Maybe (And (le min n) (le n max)));
intros;
induction mkLT min n;
refine nothing;
intros;
induction mkLT n max;
refine nothing;
intros;
refine just;
refine and_intro;
refine a;
refine a0;
Qed;