Files
gf-core/examples/logic/Arithm.gf
2006-11-27 21:03:15 +00:00

65 lines
1.8 KiB
Plaintext

abstract Arithm = Logic ** {
-- arithmetic
fun
Nat : Dom ;
data
Zero : Elem Nat ;
Succ : Elem Nat -> Elem Nat ;
fun
EqNat : (m,n : Elem Nat) -> Prop ;
LtNat : (m,n : Elem Nat) -> Prop ;
Div : (m,n : Elem Nat) -> Prop ;
Even : Elem Nat -> Prop ;
Odd : Elem Nat -> Prop ;
Prime : Elem Nat -> Prop ;
one : Elem Nat ;
two : Elem Nat ;
sum : (m,n : Elem Nat) -> Elem Nat ;
prod : (m,n : Elem Nat) -> Elem Nat ;
data
evax1 : Proof (Even Zero) ;
evax2 : (n : Elem Nat) -> Proof (Even n) -> Proof (Odd (Succ n)) ;
evax3 : (n : Elem Nat) -> Proof (Odd n) -> Proof (Even (Succ n)) ;
eqax1 : Proof (EqNat Zero Zero) ;
eqax2 : (m,n : Elem Nat) -> Proof (EqNat m n) ->
Proof (EqNat (Succ m) (Succ n)) ;
fun
IndNat : (C : Elem Nat -> Prop) ->
Proof (C Zero) ->
((x : Elem Nat) -> Hypo (C x) -> Proof (C (Succ x))) ->
Proof (Univ Nat C) ;
def
one = Succ Zero ;
two = Succ one ;
sum m (Succ n) = Succ (sum m n) ;
sum m Zero = m ;
prod m (Succ n) = sum (prod m n) m ;
prod m Zero = Zero ;
LtNat m n = Exist Nat (\x -> EqNat n (sum m (Succ x))) ;
Div m n = Exist Nat (\x -> EqNat m (prod x n)) ;
Prime n =
Conj (LtNat one n)
(Univ Nat (\x -> Impl (Conj (LtNat one x) (Div n x)) (EqNat x n))) ;
fun ex1 : Text ;
def ex1 =
ThmWithProof
(Univ Nat (\x -> Disj (Even x) (Odd x)))
(IndNat
(\x -> Disj (Even x) (Odd x))
(DisjIl (Even Zero) (Odd Zero) evax1)
(\x -> \h -> DisjE (Even x) (Odd x) (Disj (Even (Succ x)) (Odd (Succ x)))
(Hypoth (Disj (Even x) (Odd x)) h)
(\a -> DisjIr (Even (Succ x)) (Odd (Succ x))
(evax2 x (Hypoth (Even x) a)))
(\b -> DisjIl (Even (Succ x)) (Odd (Succ x))
(evax3 x (Hypoth (Odd x) b))
)
)
) ;
} ;