gpt4 book ai didi

coq - Coq 中的受限归纳类型定义

转载 作者:行者123 更新时间:2023-12-04 21:52:08 27 4
gpt4 key购买 nike

我想以某种方式限制在归纳定义中允许什么样的输入构造函数。说我想说定义二进制数如下:

Inductive bin : Type :=
| O : bin
| D : bin -> bin
| S : bin -> bin.

这里的想法是 D 通过在末尾添加一个零来将一个非零数字加倍,而 S 将一个以零作为最后一位的数字并将最后一位数字变成一。这意味着以下是合法数字:
S 0
D (S 0)
D (D (S 0))

而以下不会:
S (S 0)
D 0

有没有办法以干净的方式在归纳定义中强制执行此类限制?

最佳答案

您可以定义 bin 的含义谓词合法,然后为 bin 的子集命名s 服从那个谓词。然后你用 Program Definition 写函数和 Program Fixpoint而不是 DefinitionFixpoint .对于递归函数,您还需要一个度量来证明函数的参数在大小上减小了,因为函数在结构上不再是递归的。

Require Import Coq.Program.Program.

Fixpoint Legal (b1 : bin) : Prop :=
match b1 with
| O => True
| D O => False
| D b2 => Legal b2
| S (S _) => False
| S b2 => Legal b2
end.

Definition lbin : Type := {b1 : bin | Legal b1}.

Fixpoint to_un (b1 : bin) : nat :=
match b1 with
| O => 0
| D b2 => to_un b2 + to_un b2
| S b2 => Coq.Init.Datatypes.S (to_un b2)
end.

Program Definition zer (b1 : lbin) := O.

Program Fixpoint succ (b1 : lbin) {measure (to_un b1)} : lbin :=

但是 this简单类型的方法可能会更容易。

关于coq - Coq 中的受限归纳类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14008722/

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