gpt4 book ai didi

math - 在 Coq 中建立良好的递归

转载 作者:行者123 更新时间:2023-12-04 12:38:57 24 4
gpt4 key购买 nike

我正在尝试编写一个用于在 Coq 中计算自然除法的函数,但在定义它时遇到了一些麻烦,因为它不是结构递归。

我的代码是:

Inductive N : Set :=
| O : N
| S : N -> N.

Inductive Bool : Set :=
| True : Bool
| False : Bool.

Fixpoint sum (m :N) (n : N) : N :=
match m with
| O => n
| S x => S ( sum x n)
end.

Notation "m + n" := (sum m n) (at level 50, left associativity).

Fixpoint mult (m :N) (n : N) : N :=
match m with
| O => O
| S x => n + (mult x n)
end.

Notation "m * n" := (mult m n) (at level 40, left associativity).

Fixpoint pred (m : N) : N :=
match m with
| O => S O
| S x => x
end.

Fixpoint resta (m:N) (n:N) : N :=
match n with
| O => m
| S x => pred (resta m x)
end.
Notation "m - x" := (resta m x) (at level 50, left associativity).

Fixpoint leq_nat (m : N) (n : N) : Bool :=
match m with
| O => True
| S x => match n with
| O => False
| S y => leq_nat x y
end
end.

Notation "m <= n" := (leq_nat m n) (at level 70).

Fixpoint div (m : N) (n : N) : N :=
match n with
| O => O
| S x => match m <= n with
| False => O
| True => pred (div (m-n) n)
end
end.

正如你所看到的,Coq 不喜欢我的函数 div,它说

Error: Cannot guess decreasing argument of fix.



如何在 Coq 中为这个函数提供终止证明?我可以证明如果 n>O ^ n<=m -> (m-n) < m。

最佳答案

在这种情况下,最简单的策略可能是使用 Program扩展名与 measure 一起.然后,您必须提供证据,证明根据度量,递归调用中使用的参数小于顶级参数。

Require Coq.Program.Tactics.
Require Coq.Program.Wf.

Fixpoint toNat (m : N) : nat :=
match m with O => 0 | S n => 1 + (toNat n) end.

Program Fixpoint div (m : N) (n : N) {measure (toNat m)}: N :=
match n with
| O => O
| S x => match m <= n with
| False => O
| True => pred (div (m-n) n)
end
end.
Next Obligation.
(* your proof here *)

关于math - 在 Coq 中建立良好的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33302526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com