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规则,有时则不会。
- 关于下面的示例,我是否应该知道它只是将
复制为simp规则yield2_def
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
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
的所有实现放在右手边的一个公式中。