'案例_'非数据类型常量args,simps_of_case

时间:2015-09-04 18:19:49

标签: isabelle

我正在查看case运算符,看看它能为我做些什么。

没有问题。鉴于我与之合作的例子,我接受了#34;它做了它所做的事情",但我会问一些问题,以防有更多东西要学习。

  1. case运算符似乎不能接受常量参数,除非它们是datatype常量。如果它们不是,它会提供无信息的消息:"案例表达式出错:类型不匹配"
    • 我可以在非数据类型常量上获得case模式匹配吗?
  2. 关键字simps_of_case有时会从case生成简单规则,有时它不会生成简单规则。
    • 我是否应该知道下面的示例,它只是将yield2_def重现为simp规则?
  3. 我从How to define a partial function in Isabelle?simps_of_case举了一个例子。我似乎在case围绕datatype设计了某个地方,但我找不到我从中学到的地方。

    我在实例中加入了一个简短的理论:

    theory i150903a__a0  
    imports Complex_Main "~~/src/HOL/Library/Simps_Case_Conv"
    begin 
    (*************************************************************************)
    section{* simps_of_case: Doesn't generate any new simps *}
    
    (*(58)/src/HOL/Lazy_Sequence.thy
    [∙) Doesn't generate any new simp rules. Because of 'list_of_lazy_sequence'?*)
    definition yield2 :: "'a lazy_sequence => ('a × 'a lazy_sequence) option"
    where
      "yield2 xq = (case list_of_lazy_sequence xq of
        [] => None
      | x # xs => Some (x, lazy_sequence_of_list xs))"
    
    thm yield2_def  
    find_theorems name: yield2
    
    simps_of_case yield2_simps[simp]: yield2_def
    
    thm yield2_simps
    find_theorems name: yield2
    
    (*************************************************************************)
    section{* simps_of_case: Does generate new simps *}
    
    (*140813a__SOz__How to define a partial function in Isabelle*)
    partial_function (tailrec) oddity :: "nat => nat" where 
      "oddity x = (case x of (Suc (Suc n)) => n | 0 => 0 )"
    
    thm oddity.simps  
    find_theorems name: oddity
    
    simps_of_case oddity_simps[simp]: oddity.simps
    
    thm oddity_simps
    find_theorems name: oddity
    
    (*************************************************************************)
    section{* Case constant arguments must be datatypes? *}
    
    declare[[show_sorts]]
    (*Works*)
    term "case (x,y) of (None, None) => (0::'a::zero, 0::'b::zero)"
    
    term "case (x,y) of (0::nat, 0::nat) => (0::'a::zero, 0::'b::zero)"
    
    term "case (x,y) of (0::nat, x # xs) => (0::'a::zero, 0::'b::zero)"
    
    term "case (x,y) of (a,b) => (0::'a::zero, 0::'b::zero)"
    
    fun foofun :: "('a::zero, 'b::zero) prod => ('a, 'b) prod" where
      "foofun (x,y) = (case (x,y) of (a,b) => (0,0))"
    
    (*OUTPUT: "Error in case expression: type mismatch"*)  
    term "case (x,y) of (0::nat, 0::int) => (0::'a::zero, 0::'b::zero)"
    
    fun foofun :: "('a::zero, 'b::zero) prod => ('a, 'b) prod" where
      "foofun (x,y) = (case (x,y) of (0,0) => (0,0))"
    
    (*************************************************************************)
    section{* Theory end *}
    end
    

1 个答案:

答案 0 :(得分:1)

  1. 案例语法只是糖 - 它被设计成适当的“案例组合器”的嵌套应用程序。数据类型手册在§2.3中简要提示。据我所知,必须有一个给定类型的case组合器,以便case语法工作。现有的情况组合器例如是case_optioncase_list。现在,如果某些内容尚未定义为数据类型,则还有其他方法可以获取该组合子(例如free_constructors)命令。 int没有这种设置。

  2. simps_of_casef x = P (case x of ...)形式的等式转换为f pat1 = P ...f pat2 = P ...形式的等式,...如果你是一个模式匹配的术语不是参数列表中的变量,它不能这样做。在您的示例中,您希望生成什么?