Я хочу создать новый тип данных, похожий на старый, но (в отличие от type_synonym
) он должен быть распознан как отдельный в других теориях.Есть ли эквивалент Изабеллы для нового типа Haskell?
Мой мотивирующий пример: я делаю стековый тип данных из списков. Я не хочу, чтобы мои другие теории, чтобы увидеть мои stack
с, как list
с, так что я могу применять свои собственные правила упрощения на нем, но единственное решение я нашел следующее:
datatype 'a stk = S "'a list"
...
primrec index_of' :: "'a list => 'a => nat option"
where "index_of' [] b = None"
| "index_of' (a # as) b = (
if b = a then Some 0
else case index_of' as b of Some n => Some (Suc n) | None => None)"
primrec index_of :: "'a stk => 'a => nat option"
where "index_of (S as) x = index_of' as x"
...
lemma [simp]: "index_of' del v = Some m ==> m <= n ==>
index_of' (insert_at' del n v) v = Some m"
<proof>
lemma [simp]: "index_of del v = Some m ==> m <= n ==>
index_of (insert_at del n v) v = Some m"
by (induction del, simp)
Он работает, но это означает, что моя теория stack
раздута и заполнена слишком избыточным избытком: каждая функция имеет вторую версию, отключающую конструктор, и каждая теорема имеет вторую версию (для которой доказательство всегдаby (induction del, simp)
, которое поражает меня как знак Я делаю слишком много работы где-то).
Есть ли что-нибудь, что поможет здесь?
Спасибо! Поэтому я заменяю свое определение 'index_of' параметром' lift_definition index_of :: "'anv =>' a => nat 'is index_of' by simp' , а затем доказательства просто выпадают с одной леммой, а не с двумя? – Zyzzyva
Поскольку функции работают, но, пытаясь доказать доказательства, он не делает индукции в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '': он просто добавляет 'ya: {xs. True} ==> 'предпосылка. Как мне заставить поднять доказательства? – Zyzzyva