Я смотрел на оператора case
, чтобы посмотреть, что он может сделать для меня.'case _ of' non-datatype constant args, simps_of_case
Нет проблем. Учитывая примеры, с которыми я работаю, я согласен с тем, что «он делает то, что он делает», но я задаю несколько вопросов, если есть чему поучиться.
- Оказывается, что оператор
case
не может принимать аргументы, которые являются постоянными, если они неdatatype
константы. Если это не так, это дает неинформативное сообщение: «Ошибка в выражении случая: несоответствие типа».- Могу ли я получить
case
для соответствия шаблону по константе не-типа данных?
- Могу ли я получить
- Ключевое слово
simps_of_case
иногда производит правила simp отcase
, а иногда и нет.- Есть ли что-то, что я должен знать о примере ниже, где он просто воспроизводит
yield2_def
в качестве правила simp?
- Есть ли что-то, что я должен знать о примере ниже, где он просто воспроизводит
Я взял один пример simps_of_case
из How to define a partial function in Isabelle?. Кажется, что я узнал где-то, что 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
Lars, спасибо. Есть два случая '[]' и 'x # xs', поэтому я подумал, что было бы неплохо получить больше, чем' yield2_def', но я только сравнивал его с другим примером, делая эксперименты с plug'n'play. Я пытался выяснить, не может ли случай преодолеть ограничения соответствия шаблону с 'fun', но я думаю, что теперь вижу, что это похоже на« if/then/else », где его можно использовать как оператор в функции defs. Я не нашел избыточного количества мест, которые он использовал в источниках HOL. Я искал примеры, где упорядоченная пара соответствует. Ошибка не позволяла мне узнать, умеет ли использовать синтаксис. –
На самом деле, команда 'function' может выполнять почти произвольное сопоставление шаблонов. Просто нужно вручную доказать, что уравнения фактически не перекрываются (или, если они перекрываются, они согласованы). –
@Lars, до сих пор я не мог использовать 'function' и просто использовал' fun'. Я забыл, какие проблемы у меня были в точности, но я стараюсь добавить в свой инструментарий работу без «удовольствия». Во-первых, я обнаружил, что 'f' с' if/else' с 'definition' или' f', определяемым 'primrec', будет автоматически проверяться, когда' f', определяемый 'fun', не будет , С 'case', у меня есть еще один способ экспериментировать с определением функции, где я помещаю всю реализацию' f' в одну формулу с правой стороны. –