我正在查看case
运算符,看看它能为我做些什么。
没有问题。鉴于我与之合作的例子,我接受了#34;它做了它所做的事情",但我会问一些问题,以防有更多东西要学习。
case
运算符似乎不能接受常量参数,除非它们是datatype
常量。如果它们不是,它会提供无信息的消息:"案例表达式出错:类型不匹配" 。
case
模式匹配吗?simps_of_case
有时会从case
生成简单规则,有时它不会生成简单规则。
yield2_def
重现为simp规则?我从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
答案 0 :(得分:1)
案例语法只是糖 - 它被设计成适当的“案例组合器”的嵌套应用程序。数据类型手册在§2.3中简要提示。据我所知,必须有一个给定类型的case组合器,以便case语法工作。现有的情况组合器例如是case_option
和case_list
。现在,如果某些内容尚未定义为数据类型,则还有其他方法可以获取该组合子(例如free_constructors
)命令。 int
没有这种设置。
simps_of_case
将f x = P (case x of ...)
形式的等式转换为f pat1 = P ...
,f pat2 = P ...
形式的等式,...如果你是一个模式匹配的术语不是参数列表中的变量,它不能这样做。在您的示例中,您希望生成什么?