52 lines
1.0 KiB
Coq
52 lines
1.0 KiB
Coq
Require Import ZArith Lia.
|
|
|
|
Search (nat -> Z).
|
|
|
|
Definition f (n:nat) : Z :=
|
|
if (Nat.eqb n 0) then 1
|
|
else if (Nat.even n) then (Z.of_nat (Nat.div n 2))
|
|
else -(Z.of_nat (Nat.div (n-1) 2)).
|
|
Compute f 0.
|
|
Compute f 1.
|
|
Compute f 2.
|
|
Compute f 3.
|
|
Compute f 4.
|
|
Compute f 5.
|
|
|
|
Compute (1=?1)%bool.
|
|
|
|
Theorem f_inj : forall a b:nat, (a > 0) -> (b > 0) ->
|
|
(f a = f b) -> (a = b).
|
|
Proof.
|
|
intros.
|
|
case_eq (Nat.eqb a 1).
|
|
- intros.
|
|
|
|
intros.
|
|
destruct a.
|
|
- lia. (* case: a = 0 *)
|
|
- destruct a.
|
|
* lia. (* case: a = S a' = S 0 = 1 *)
|
|
* (* case: a = S a' = S (S a'') *)
|
|
Restart.
|
|
intros.
|
|
destruct (Nat.even a).
|
|
- destruct (Nat.odd a).
|
|
|
|
Definition egfn (n:nat):nat := n + 1.
|
|
Goal
|
|
(*let egfn := fun n:nat => n + 1 in*)
|
|
forall a b:nat, egfn a = egfn b -> a = b.
|
|
Proof.
|
|
intros.
|
|
Abort.
|
|
|
|
Definition f (val:{n:nat | n > 0}) : Z :=
|
|
let n':nat :=
|
|
match val with
|
|
| exists P x prf => x
|
|
end in
|
|
if (Nat.eqb 1 0) then 1
|
|
else if (Nat.even n) then (Z.of_nat (Nat.div n 2))
|
|
else -(Z.of_nat (Nat.div (n-1) 2)).
|