假设您要在Isabelle中正式定义以下定义:
add a b =
if f(a,b) ≠ 0 then add_1 a b
if g(a,b) ≠ 0 then add_2 a b
我不想给任何选项任何 preference 。实际上,我需要证明的下一个属性是:
在Isabelle中应使用什么建模模型?也许是部分函数?
您可以在this paper上看到等式(17)和引理4.3.4、4.3.4,以了解我在说什么引理。
答案 0 :(得分:1)
您可以将function
命令与重叠的方程式和前提条件一起使用:
function add :: "..." where
"add a b = add_1 a b" if "f a b ≠ 0"
| "add a b = add_2 a b" if "g a b ≠ 0"
apply(atomize_elim) (* makes the exhaustiveness goal more readable *)
这为您提供了证明义务,即案例确实是详尽无遗的,并且当它们重叠时,右侧会出现相同的脱节。显示此内容后,您必须显示终止(如果您的函数不是递归的,则可以通过以下方式简单完成
:termination by lexicographic_order
如果您的方程式实际上并不详尽,那么您首先必须添加更多的情况。在此示例中,您可以添加
| "add a b = undefined a b" if "f a b = 0 & g a b = 0"
表示,如果f
和g
均为0
,则add a b
表示一些未指定的值,并且对于每个{{ 1}}和a
。