伊莎贝尔的终止证明

问题描述

我正在尝试为此功能提供自动终止证明:

function aux :: "('a ⇒ bool) ⇒ 'a list ⇒ 'a list" where
  "aux p xs = (if ¬isEmpty xs ∧ p (hd xs) then hd xs#aux p (drop 1 xs) else [])"
  by pat_completeness auto 

isEmpty

fun isEmpty :: "'a list ⇒ bool" where
  "isEmpty [] = True"
| "isEmpty (_#_) = False"

我对此完全陌生,所以我不知道终止证明是如何工作的,或者 pat_completeness 是如何工作的。

任何人都可以提供参考以了解更多信息和/或帮助我解决这个特定示例吗?

提前致谢。

解决方法

文档位于 https://isabelle.in.tum.de/dist/Isabelle2021/doc/functions.pdf 的第 4 节。

这个想法是提供一个有充分根据的关系,并且递归调用的参数正在减少。在您的情况下,第二个参数的长度正在减少,因此:

function aux :: "('a ⇒ bool) ⇒ 'a list ⇒ 'a list" where
  "aux p xs = (if xs≠ [] ∧ p (hd xs) then hd xs#aux p (drop 1 xs) else [])"
   by pat_completeness auto
termination
  by (relation ‹measure (λ(_,xs). length xs)›)
    auto

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...