playground/coq/log10-casteran.v

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)).