Рассмотрим следующую глупое определение Isabelle деревьев и поддеревьев:Расторжение доказательство с функциями, используя набор постижений
datatype tree = Leaf int
| Node tree tree
fun children :: "tree ⇒ tree set" where
"children (Leaf _) = {}" |
"children (Node a b) = {a, b}"
lemma children_decreasing_size:
assumes "c ∈ children t"
shows "size c < size t"
using assms
by (induction t, auto)
function subtrees :: "tree ⇒ tree set" where
"subtrees t = { s | c s. c ∈ children t ∧ s ∈ subtrees c }"
by auto
termination
apply (relation "measure size", simp)
Расторжение доказательство subtrees
застревает в этой точке, хотя рекурсивные вызовы только когда-либо делали на детей, которые строго ограничены обоснованным отношением size
(как показывает тривиальная лемма).
Доказательство состояния выглядит следующим образом:
goal (1 subgoal):
1. ⋀t x xa xb. (xa, t) ∈ measure size
Это невозможно доказать, конечно, так как информация, что xa
является дочерним t
теряется. Я сделал что-то не так? Есть ли что-нибудь, что я могу сделать, чтобы сохранить доказательство? Хочу отметить, что я могу сформулировать такое же определение, используя списки вместо множества:
fun children_list :: "tree ⇒ tree list" where
"children_list (Leaf _) = []" |
"children_list (Node a b) = [a, b]"
function subtrees_list :: "tree ⇒ tree list" where
"subtrees_list t = concat (map subtrees_list (children_list t))"
by auto
termination
apply (relation "measure size", simp)
и получить более информативный, доказуемую терминации цель:
goal (1 subgoal):
1. ⋀t x.
x ∈ set (children_list t) ⟹
(x, t) ∈ measure size
Является ли это некоторые ограничения в Изабелле, что я должен просто работать вокруг, не используя наборы для этого?
Знаете ли вы, что, согласно вашему определению, 'subtrees' всегда возвращает пустой набор? –
Хех, хорошо поймать. Это было упрощено (слишком много) из чего-то более сложного, что я пытаюсь сделать. –