Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tree 测试等于0%R,实数单位为Coq_Tree_Polymorphism_Coq - Fatal编程技术网

Tree 测试等于0%R,实数单位为Coq

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

我试图为我想在Coq中做的一些事情创建一个加权树库。树的每条边都应该有一个实数值权重。我想要的操作之一是一个修剪函数,如果树的叶边的权重为0,它会修剪树的叶边

以下代码是我对树的设置:

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
      时,您必须为该类型编写一个版本的
      eqb
      。标准库中的type类可以减少编程的难度

    • 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
      时,您必须为该类型编写一个版本的
      eqb
      。标准库中的type类可以减少编程的难度

    • wt_prune_list
      中,您还必须使用该数字类型的相等运算符测试数字是否为零(例如,对于有理数,
      Qeq_bool
      对于自然数,
      beq_nat

    • 使用布尔值或
      |
      代替
      \/


    最后,不幸的是,没有什么能达到您建议的
    \u 1
    模式的效果。

    谢谢。不幸的是,对于我的应用程序,我需要reals和preferential fxns,所以coq似乎无法解决我的问题。我很好奇您想用树做什么。您想用它有效地计算什么吗se树?如果是,您希望如何对任意实数进行运算?如果您需要实数,则无法测试它们的相等性。您最好使用