方程式编译器和WellFoundedRelation#

要递归地定义函数和证明,如果在该类型上有良好的关系,则可以使用公式编译器

例如,naturals上的gcd定义使用了基础良好的递归

定义 gcd公司 ( n个 : 国家) : 国家 :=
  如果  = 0 然后
    n个
  其他的
    gcd公司 (n个 % ) 
  终止(_B) 
  减少_by simp_wf; 应用 模式lt _ (零_总_总_零 _); 假设

因为<是一种有充分根据的自然关系,而且因为m=0→n%m<m这个递归函数基础很好。

无论何时使用公式编译器,在递归的类型上都会有一个默认的基础良好的关系(由良好的关系实例),公式编译器将自动尝试证明函数在所述关系下建立良好。

当方程式编译器失败时,有两个主要原因。

  1. 它找不到减少的措施。
  2. 它未能证明所需的不平等。

证明所需不等式#

如果我们修改上面的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⊢n%m<m

顺便说一下,假设小时✝ : 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公司:

实例 [ : 良好的关系 α] [血红蛋白 : 良好的关系 β] : 良好的关系 (α × β) :=
  法律  血红蛋白