Tree 测试等于0%R,实数单位为Coq
我试图为我想在Coq中做的一些事情创建一个加权树库。树的每条边都应该有一个实数值权重。我想要的操作之一是一个修剪函数,如果树的叶边的权重为0,它会修剪树的叶边 以下代码是我对树的设置:Tree 测试等于0%R,实数单位为Coq,tree,polymorphism,coq,Tree,Polymorphism,Coq,我试图为我想在Coq中做的一些事情创建一个加权树库。树的每条边都应该有一个实数值权重。我想要的操作之一是一个修剪函数,如果树的叶边的权重为0,它会修剪树的叶边 以下代码是我对树的设置: Require Import Coq.Reals.Reals. Require Import Coq.Lists.List. Section WeightedTrees. Inductive wtree' (A : Type) : Type := | Null : wtree' A | LNode
Require Import Coq.Reals.Reals.
Require Import Coq.Lists.List.
Section WeightedTrees.
Inductive wtree' (A : Type) : Type :=
| Null : wtree' A
| LNode : A -> wtree' A
| INode : A -> list (wtree' A) -> wtree' A.
Inductive Wtype (A : Type) : Type := W: R -> A -> Wtype A.
Definition wtree (A : Type) := wtree' (Wtype A).
(* Helper: checks whether a tree contains an element *)
Fixpoint wt_contains {A : Type} (a : A) (t : wtree A) : Prop :=
match t with
| Null => False
| LNode (W w a') => a' = a
| INode (W w a') l => a' = a \/ (fold_left or (map (wt_contains a) l) True)
end.
下面是我目前对剪枝函数的尝试。Coq不接受它,因为0%R不是共感应类型
Fixpoint wt_prune_list {A : Type} (l:list (wtree A)) : (list (wtree A)) :=
match l with
| nil => nil
| (cons Null l) => (cons (Null (Wtype A)) (wt_prune_list l))
| (cons (INode w l') l) => (cons ((INode (Wtype A)) w l') ((wt_prune_list A) l))
| (cons (LNode (W w a')) l) =>
if w = 0%R then
(wt_prune_list l)
else
(cons (LNode (W w a')) (wt_prune_list l))
end.
所以我有几个问题:
w=0%R
这样的东西是否有意义?我想,如果我们有一个证明,w=0%R
,我们应该把这看作是在说。是这样吗李>
(cons(INode w l')l)=>(cons((INode(Wtype A))w l')((wt_prune_list A)l))
?我知道我本可以匹配(cons(INode)\uu)
,但似乎我没有好的方法来构建另一面。如果有类似于(cons(INode\u 1)\u 2)=>(cons(INode\u 1)((wt\u prune\u list A)\u 2)
的东西,Coq可以发现\u 1
以与
相同的方式表示多个参数这里的问题是,标准Coq库中实数的定义不是计算性的,而是公理性的。这意味着在Coq中没有办法用实数进行计算,只能证明实数。另一种方法是使用,甚至是纯自然数 您的代码还有一个微妙的概念问题:它使用纯逻辑实体而不是计算实体,即您的函数使用的是
Prop
而不是bool
Prop
s不能像bool
那样真正产生答案;特别是,您无法测试Prop
i这是真是假,就像你在wt\u prune\u list
中所做的那样。对于这个答案来说,详细讨论这个差异可能太多了,但是一开始你可以把Prop
看作是你可以试着以交互方式证明的东西,而bool
只是另一种数据类型,比如nat
或list
以下是解决此问题的方法:
- Coq没有生成
的通用相等运算符。原因是没有确定两个值是否相等的通用过程。您使用的bool
实际生成的是=
。因此,您需要传递到Prop
wt\u包含一个附加函数
。在对特定类型实例化eqb:测试两个元素是否相等的->A->bool
时,您必须为该类型编写一个版本的wt_contains
。标准库中的type类可以减少编程的难度eqb
- 在
中,您还必须使用该数字类型的相等运算符测试数字是否为零(例如,对于有理数,wt_prune_list
对于自然数,Qeq_bool
)beq_nat
- 使用布尔值或
代替|
\/
最后,不幸的是,没有什么能达到您建议的
\u 1
模式的效果。这里的问题是,标准Coq库中实数的定义不是计算性的,而是公理性的。这意味着在Coq中没有办法用实数计算,只能证明它们的相关情况。一个另一种选择是使用自然数,甚至是简单的自然数
您的代码还有一个微妙的概念问题:它使用纯逻辑实体而不是计算实体,即您的函数使用的是Prop
而不是bool
Prop
s不能像bool
那样真正产生答案;特别是,您无法测试Prop
i这是真是假,就像你在wt\u prune\u list
中所做的那样。对于这个答案来说,详细讨论这个差异可能太多了,但是一开始你可以把Prop
看作是你可以试着以交互方式证明的东西,而bool
只是另一种数据类型,比如nat
或list
以下是解决此问题的方法:
- Coq没有生成
的通用相等运算符。原因是没有确定两个值是否相等的通用过程。您使用的bool
实际生成的是=
。因此,您需要传递到Prop
wt\u包含一个附加函数
。在对特定类型实例化eqb:测试两个元素是否相等的->A->bool
时,您必须为该类型编写一个版本的wt_contains
。标准库中的type类可以减少编程的难度eqb
- 在
中,您还必须使用该数字类型的相等运算符测试数字是否为零(例如,对于有理数,wt_prune_list
对于自然数,Qeq_bool
)beq_nat
- 使用布尔值或
代替|
\/
最后,不幸的是,没有什么能达到您建议的
\u 1
模式的效果。谢谢。不幸的是,对于我的应用程序,我需要reals和preferential fxns,所以coq似乎无法解决我的问题。我很好奇您想用树做什么。您想用它有效地计算什么吗se树?如果是,您希望如何对任意实数进行运算?如果您需要实数,则无法测试它们的相等性。您最好使用