Следующее определение функции принимается Isabelle, поэтому прекращение проверки доволен этим:Прекращение проверки типов продукции
datatype 'a List = N | C 'a "'a List"
fun dequeue' :: "'a List × 'a List ⇒ ('a option × 'a queue)" where
"dequeue' (N, N) = (None, AQueue N N)"
|"dequeue' (xs, C y ys) = (Some y, AQueue xs ys)"
|"dequeue' (xs, N) = dequeue' (N, reverse xs)"
Это, казалось бы, эквивалентное определение, используя пользовательские, но тип изоморфные данных вместо пары , отклоняется:
fun dequeue :: "'a queue ⇒ ('a option × 'a queue)" where
"dequeue (AQueue N N) = (None, AQueue N N)"
|"dequeue (AQueue xs (C y ys)) = (Some y, AQueue xs ys)"
|"dequeue (AQueue xs N) = dequeue (AQueue N (reverse xs))"
Почему это? Есть ли какая-то специальная настройка для пар здесь, и если да, могу ли я расширить эту настройку до моего пользовательского типа данных? Должно быть, datatype
сделать это автоматически?
Связанный: http://stackoverflow.com/questions/29534558/make-automatic-termination-proof-use-different-size-function?rq=1 –
Он также работает, чтобы написать 'lemma [measure_function]:" is_measure f ⟹ is_measure (λ q. f (молодой q, старый y)) ", который должен быть относительно полным. Интересно, должно ли это быть по умолчанию. –