2016-02-05 2 views
0

Следующее определение функции принимается 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 сделать это автоматически?

ответ

0

Я мог бы ответить на это сам. После того, как копаться в какой-то код, я нашел это в HOL/Fun_Def.thy:

lemma measure_fst[measure_function]: "is_measure f ⟹ is_measure (λp. f (fst p))" 
by (rule is_measure_trivial) 
lemma measure_snd[measure_function]: "is_measure f ⟹ is_measure (λp. f (snd p))" 
by (rule is_measure_trivial) 

и в самом деле, дублируя эту установку с помощью

datatype 'a queue = AQueue (young: "'a List") (old: "'a List") 

lemma [measure_function]: "is_measure f ⟹ is_measure (f ∘ young)" .. 

Второе определение функции в коде выше проходит через а.

+0

Связанный: http://stackoverflow.com/questions/29534558/make-automatic-termination-proof-use-different-size-function?rq=1 –

+0

Он также работает, чтобы написать 'lemma [measure_function]:" is_measure f ⟹ is_measure (λ q. f (молодой q, старый y)) ", который должен быть относительно полным. Интересно, должно ли это быть по умолчанию. –