76 lines
1.5 KiB
Coq
76 lines
1.5 KiB
Coq
Require Import Recdef.
|
|
Require Import ZArith Lia.
|
|
|
|
Compute (2/3)%Z.
|
|
|
|
Fail Fixpoint log10 (n:Z): Z :=
|
|
if Zlt_bool n 10 then 0
|
|
else 1 + log10 (n/10).
|
|
|
|
Fail Program Fixpoint log10 (n:nat): nat :=
|
|
if Nat.ltb n 10 then 0
|
|
else 1 + log10 (Nat.div n 10).
|
|
|
|
Function log10 (n:Z) {measure Z.abs_nat n} : nat :=
|
|
if Z.ltb n 10 then 0
|
|
else 1 + log10 (n/10).
|
|
Proof.
|
|
intros n H.
|
|
rewrite Z.ltb_ge in H.
|
|
Search (Z.abs_nat).
|
|
Search (_ / _)%Z.
|
|
rewrite Nat2Z.inj_abs_nat.
|
|
lia.
|
|
|
|
|
|
|
|
rewrite Z.ltb_nlt in H.
|
|
rewrite (Znot_lt_ge n 10) in H.
|
|
Search (~(_ < _)-> _)%Z.
|
|
|
|
induction n.
|
|
- now simpl.
|
|
-
|
|
- Search ((_ <? _)=false)%Z.
|
|
Search (((_ <? _)=false) -> (_ <=? _))%Z.
|
|
Search ((_ <=? _) -> (_ / _))%Z.
|
|
|
|
Locate "_ <? _".
|
|
|
|
Check Z.leb 2 3.
|
|
|
|
intros n H.
|
|
Search Z.ltb.
|
|
unfold Z.abs_nat.
|
|
Search (_ <? _)%Z.
|
|
Restart.
|
|
intros n H.
|
|
induction n.
|
|
- now simpl.
|
|
- Search ((_ <? _)=false)%Z.
|
|
rewrite Z.ltb_nlt in H.
|
|
|
|
Search (nat -> nat -> nat).
|
|
Search (nat -> nat).
|
|
Compute Nat.div 12 10.
|
|
|
|
Fail Fixpoint log10 (n:nat): nat :=
|
|
if Nat.ltb n 10 then 0
|
|
else S (log10 (Nat.div n 10)).
|
|
(* Error: *)
|
|
(* Recursive definition of log10 is ill-formed. *)
|
|
(* In environment *)
|
|
(* log10 : nat -> nat *)
|
|
(* n : nat *)
|
|
(* Recursive call to log10 has principal argument equal to *)
|
|
(* "Nat.div n 10" instead of *)
|
|
(* a subterm of "n". *)
|
|
(* Recursive definition is: *)
|
|
(* "fun n : nat => *)
|
|
(* if Nat.ltb n 10 then 0 else S (log10 (Nat.div n 10))". *)
|
|
|
|
|
|
Function log10 (n:nat) {measure n} : nat :=
|
|
if Nat.ltb n 10 then 0
|
|
else S (log10 (Nat.div n 10)).
|