方程式编译器和WellFoundedRelation#
要递归地定义函数和证明,如果在该类型上有良好的关系,则可以使用公式编译器
例如,naturals上的gcd定义使用了基础良好的递归
定义 gcd公司 (米 n个 : 国家) : 国家 :=
如果 米 = 0 然后
n个
其他的
gcd公司 (n个 % 米) 米
终止(_B) 米
减少_by simp_wf; 应用 模式lt _ (零_总_总_零 _); 假设
因为<是一种有充分根据的自然关系,而且因为m=0→n%m<m
这个递归函数基础很好。
无论何时使用公式编译器,在递归的类型上都会有一个默认的基础良好的关系(由良好的关系
实例),公式编译器将自动尝试证明函数在所述关系下建立良好。
当方程式编译器失败时,有两个主要原因。
- 它找不到减少的措施。
- 它未能证明所需的不平等。
证明所需不等式#
如果我们修改上面的gcd示例,通过删除终止(_B)
&减少_by
,我们得到一个错误。
定义 gcd公司 (米 n个 : 国家) : 国家 :=
如果 米 = 0 然后
n个
其他的
gcd公司 (n个 % 米) 米
未能显示终止国家gcd有个错误参数#1未用于结构递归无法消除递归应用程序(n%m).gcd m参数#2未用于结构递归无法消除递归应用程序(n%m).gcd m不能使用结构递归找不到递减度量值。每个递归调用的参数关联如下:(<,≤,=:证明关系,?所有证明均失败,_:未尝试证明)百万牛顿1) 93:4-18 ? ?请使用`termination_by`指定递减度量。
错误消息指示我们使用终止(_B)
为了指定递减度量,我们使用米
作为递减的度量,但我们得到了另一个错误。
定义 gcd公司 (米 n个 : 国家) : 国家 :=
如果 米 = 0 然后
n个
其他的
gcd公司 (n个 % 米) 米
终止(_B) 米
未能证明终止,可能的解决方案:-使用“have”-表达式证明其余目标-使用`termination_by`指定不同的基础良好的关系-使用“decreasing_by”指定您自己实现此类目标的策略男:ℕ小时✝ : m=0⊢n%m<m
我们指定了正确的递减度量,因此我们的选项是使用有
-表达式或使用减少_by
.这里,我们使用通过策略减少
证明此函数的终止。首先,让我们通过占位符对不起的
显示目标。
定义 gcd公司 (米 n个 : 国家) : 国家 :=
如果 米 = 0 然后
n个
其他的
gcd公司 (n个 % 米) 米
终止(_B) 米
减少_by 对不起的
男:ℕ小时✝ : m=0⊢(invImage(fun x↦PSigma.casesOn x fun m \8614;m)instWellFoundedRelationOfSizeOf).1⟨n%m,m⟩m,n \10217]
这个目标是编译器生成的,所以很难阅读,所以我们用简单(_wf)
.
定义 gcd公司 (米 n个 : 国家) : 国家 :=
如果 米 = 0 然后
n个
其他的
gcd公司 (n个 % 米) 米
终止(_B) 米
减少_by simp_wf; 对不起的
顺便说一下,假设小时✝ : m=0
来自哪里?事实上,在终止证明中,如果p则t其他f
被重写为如果h:p,则t其他f
,所以假设对
变为可用。
剩下的任务只是证明这一目标:
定义 gcd公司 (米 n个 : 国家) : 国家 :=
如果 米 = 0 然后
n个
其他的
gcd公司 (n个 % 米) 米
终止(_B) 米
减少_by simp_wf; 应用 模式lt _ (zero_lt_of_ne_zero _); 假设
供您参考,如果我们使用选项有
-表达式,函数的形式如下:
定义 gcd公司 (米 n个 : 国家) : 国家 :=
如果 小时 : 米 = 0 然后
n个
其他的
有 := 模式lt n个 (zero_lt_of_ne_zero 小时)
gcd公司 (n个 % 米) 米
但是有
-当我们使用方程引理时,表达式可能是一个障碍。
另一个示例是中的以下函数数据。多集。基本
.
定义 strong感应开启 {对 : 多组 α → 排序*} (秒 : 多组 α) (国际卫生组织 : ∀ 秒, (∀ 吨 < 秒, 对 吨) → 对 秒) :
对 秒 :=
(国际卫生组织 秒) 乐趣 吨 _小时 =>
strong感应开启 吨 国际卫生组织
终止(_B) 卡片 秒
减少_by 准确的 卡片_卡片 _小时
此示例使用卡
作为一种减少的措施,而不是论点本身。
WellFoundedRelation实例#
我们不仅可以指定国家
值,但也包括任何类型良好的关系
作为递减的度量,正如您在中看到的数据。列表。Defs(定义)
:
定义 排列Aux.rec {C类 : 列表 α → 列表 α → 排序 v(v)} (H0型 : ∀ 是, C类 [] 是)
(上半年 : ∀ 吨 ts秒 是, C类 ts秒 (吨 :: 是) → C类 是 [] → C类 (吨 :: ts秒) 是) : ∀ l₁ l⁄, C类 l₁ l⁄
| [], 是 => H0型 是
| 吨 :: ts秒, 是 =>
上半年 吨 ts秒 是 (排列Aux.rec H0型 上半年 ts秒 (吨 :: 是)) (排列Aux.rec H0型 上半年 是 [])
终止(_B) ts秒 是 => (长度 ts秒 + 长度 是, 长度 ts秒)
减少_by 所有目标(_G) (simp_wf; 欧米茄)
此示例使用纳特×纳特
值作为递减度量。这个良好的关系
在这种类型上是自然数的字典顺序,由中的以下实例定义初始化。WF公司
:
实例 [哈 : 良好的关系 α] [血红蛋白 : 良好的关系 β] : 良好的关系 (α × β) :=
法律 哈 血红蛋白