为什么Lean强制递归类型参数出现在非递归类型之后?

时间:2017-01-21 04:42:09

标签: recursion functional-programming recursive-datastructures induction lean

以下定义被精益拒绝:

public static void main (String [] args)
{
    ATM theATM;

    try
    {
        Bank theBank = new Bank ();
        theBank.readCustomers("src/packageName/customer.txt");
        theATM = new ATM (theBank);
    }

错误消息 " arg#2;' natlist.cons'不是递归的,但它发生在递归参数之后 "

正如预期的那样接受以下定义:

inductive natlist
| nil : natlist
| cons: natlist → ℕ → natlist

精益执行此订单的原因是什么?

1 个答案:

答案 0 :(得分:3)

Lean对归纳类型的实现是基于P. Dybjer(1994)的“归纳家庭”论文:

  

Backhouse [Bac88]和Coquand和Paulin [COP90]允许在递归前提可能先于非递归前提的情况下进行不必要的推广。我更喜欢在递归之前放置所有非递归前提,因为前者在这里不能依赖后者(但是[Dyb92]中的情况发生了变化)。这种限制简化了方案的表述,并强调了与井订单的关系。

请注意,最近的commit会删除此限制,您的第一个定义现在可以使用。