Может, кто-нибудь поможет мне с доказательством увольнения в Изабель. Я пытаюсь построить из списка A новый подсписок B. Для построения B я снова и снова читаю весь A. Вынимаю элементы и использую результат для поиска следующего элемента. Я разработал простой пример, чтобы проиллюстрировать это:
дан список случайных действительных чисел. И мы говорим, что число P находится в списке, если элемент из списка больше, чем P.
definition pointOnList :: "real list ⇒ real ⇒ bool" where
"pointOnList L P ≡ ∃ i. i < length L ∧ P < L!i"
Я создаю функцию, которая всегда принимает следующий больший элемент.
fun nextPoint :: "real list ⇒ real ⇒ real" where
"nextPoint (X#Ls) P = (if (X > P)
then (X)
else (nextPoint Ls P))"
И теперь я пытаюсь создать новый отсортированный частичный список, вынимая следующий элемент большего размера, чем P, но меньше Q, с помощью nextPoint
и продолжая это делать.
function listBetween :: "real list ⇒ real ⇒ real ⇒ real list" where
"pointOnList L P ⟹ pointOnList L Q ⟹ listBetween L P Q = (if(P ≤ Q)
then(P # (listBetween L (nextPoint L P) Q))
else([]))"
Я уже продемонстрировал, что nextPoint
всегда возвращает растущее число:
lemma foo: "pointOnList P A ⟹ A < (nextPoint P A)"
доказательство прекращения с relation "measure (size o fst o snd)“
не работает для действительных чисел ... и теперь я не знаю, как продолжить.