coq - 在 coq 中定义多态归纳类型树
问题描述
我坚持练习证明我定义的树高是 3。我在网上找到了二叉树 coq 代码,但我定义的树不是二叉树。该节点包含任意数量。
下面是我的树代码:
Inductive tree (X:Type) : Type :=
| empty : tree X
| branch : X -> list (tree X) -> tree X.
Arguments tree {X}.
Arguments empty {X}.
Arguments branch {X}.
Definition mytree :=
branch 1 [ branch 5 [ branch 2 [empty] ] ; branch 8 [empty] ;
branch 7 [ branch 3 [empty];branch 4 [empty] ] ].
Fixpoint height {X: Type} (node: @tree X) : nat :=
match node with
| empty => 0
| branch _ l => S (match l with
| [] => 0
| h::t => S (height h)
end)
end.
下面是单元测试。我试图证明我的树高是 3(如图所示)
Example test_height:
height mytree = 3.
Proof.
simpl.
在我简化之后,它显示: 6 = 3: 1 子目标 ______________________________________(1/1) 6 = 3
我猜我之前定义的 BC 一个或多个函数是错误的。但我不确定是哪一个,为什么他们错了?任何人都可以帮助或给我一些提示吗?太感谢了
PS:还有一个关于练习的提示:
提示:您可能需要使用 let 表达式定义相互递归的函数。
它给出了 let 表达式的工作原理如下: • 命名递归函数(需要关键字修复):
Definition a := let fix f (x:nat) := match x with
| O => O
| S y => f y
end
in f 2.
但我不确定如何在我的练习中使用这个让。
解决方案
您错误地定义了高度函数。您应该通过伪代码定义高度
height empty = 0
height (branch _ children) = 1 + max [height child | child in children]
如果孩子为空,则最大值应返回 0。一旦你正确定义了高度函数,你应该能够使用反身性来证明这个命题。
推荐阅读
- android - 铃声类不在android中播放声音
- python - 如何在python中调整y轴距离?
- ios - 与 NSUserDefaults 和 NSArray 交互时崩溃
- php - 我有一个 php 文件并使用 Dockerfile 构建。在我的 php 文件中,如何从 AWS Batch 作业定义中获取参数集?
- firebase - 当来自 firestore 的该字段有一些更新时,我需要在 UI 中更新字段数据
- security - 支持物联网的医疗设备中的安全漏洞
- angular - 如何根据Angular 8中的页面设置标题图标,如后退箭头或菜单
- php - Wordpress - 按价格 ASC 排序时,没有价格的产品会排在底部
- reactjs - 如何从反应js中的另一个功能组件调用功能组件
- java - 在 Android 益智游戏中点击图片拖动