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

Isabelle ';案例';非数据类型常量args,simps_of_case,isabelle,Isabelle,我正在查看案例操作符,看看它能为我做些什么 没问题。考虑到我正在使用的例子,我接受“它做它做的”,但我会问一些问题,以防有更多的东西需要学习 似乎case运算符不能接受常量参数,除非它们是数据类型常量。如果不是,则会给出非信息性消息:“case表达式中的错误:类型不匹配”。 我可以让case在非数据类型常量上进行模式匹配吗 关键字simps\u of_case有时会从case生成simp规则,有时则不会。 关于下面的示例,我是否应该知道它只是将yield2_def复制为simp规则 我举

我正在查看
案例
操作符,看看它能为我做些什么

没问题。考虑到我正在使用的例子,我接受“它做它做的”,但我会问一些问题,以防有更多的东西需要学习

  • 似乎
    case
    运算符不能接受常量参数,除非它们是
    数据类型
    常量。如果不是,则会给出非信息性消息:“case表达式中的错误:类型不匹配”。
    • 我可以让
      case
      在非数据类型常量上进行模式匹配吗
  • 关键字
    simps\u of_case
    有时会从
    case
    生成simp规则,有时则不会。
    • 关于下面的示例,我是否应该知道它只是将
      yield2_def
      复制为simp规则
  • 我举了一个例子来说明案例的
    simps\u
    from。似乎我在某个地方了解到,
    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
    
  • 大小写语法是唯一的糖类——它被分解为适当的“大小写组合符”的嵌套应用程序。数据类型手册在§2.3中简要说明了这一点。据我所知,给定类型必须有一个case组合符才能使case语法起作用。现有的案例组合是例如
    case\u选项
    case\u列表
    。现在,如果没有将某个对象定义为数据类型,那么还有其他方法可以获得该组合器(例如,
    free\u constructors
    )命令。
    int
    没有这种设置

  • simps\u of_case
    将形式为
    fx=p(情况x of…
    的方程式转换为形式为
    fpat1=p…
    fpat2=p…
    。。。如果您在一个不是参数列表中变量的项上进行模式匹配,它就不能这样做。在您的示例中,您希望生成什么


  • 拉尔斯,谢谢。有两种情况,分别是
    []
    x#xs
    ,因此我认为获得比
    yield2_def
    更多的收益会更好,但我只是将其与另一个示例进行比较,进行即插即用实验。我试着看看case是否能克服模式匹配的局限性,比如
    fun
    ,但我想现在我看到它就像“if/then/else”,可以在函数defs中用作操作符。我没有发现在HOL资源中使用过多的地方。我在寻找一个有序配对匹配的例子。这个错误让我不知道是否知道如何使用语法。实际上,
    函数
    命令可以进行几乎任意的模式匹配。只是需要手动证明方程实际上是不重叠的(或者,如果它们重叠,它们是一致的)。@Lars,到目前为止,我没有使用
    函数
    ,而是使用
    乐趣
    。我忘了我到底遇到了什么问题,但我试着在工具箱中添加一些没有乐趣的东西。首先,我发现使用
    if/else
    definition
    f
    或使用
    primrec
    定义的
    f
    将自动得到证明,而使用
    fun
    定义的
    f
    则不会。有了
    case
    ,我又有了一种方法来尝试定义一个函数,我将
    f
    的所有实现放在右手边的一个公式中。