L-product-0定理

时间:2015-02-26 18:34:29

标签: agda

我想证明以下内容:

-product-0 : ∀{l :  ℕ} → list-any (_=ℕ_ 0) l ≡ tt → -product l ≡ 0
-product-0 = {!!}

'list-any'定义为:

list-any : ∀{ℓ}{A : Set ℓ}(pred : A → )(l :  A) → 
list-any pred [] = ff
list-any pred (x :: xs) = pred x || list-any pred xs

_=ℕ_定义为:

_=ℕ_ : ℕ → ℕ → 
0 =ℕ 0 = tt
suc x =ℕ suc y = x =ℕ y
_ =ℕ _ = ff

我正在尝试理解这一部分:list-any (_=ℕ_ 0) l ≡ tt

(_=ℕ_ 0) ≡ (pred : A → )l ≡ (l : A)

如果是这样,我想帮助理解谓词。 ( =ℕ 0)是什么意思?我假设 =ℕ的应用如下:

l return中的Foreach元素(element =ℕ0)。

这是对的吗?我试图通过使用列表l1来证明这个定理:

-product-0 : ∀{l :  ℕ} → list-any (_=ℕ_ 0) l ≡ tt → -product l ≡ 0
-product-0 l1 = {!!}

但出现以下错误:

I'm not sure if there should be a case for the constructor refl,
because I get stuck when trying to solve the following unification
problems (inferred index ≟ expected index):
  list-any (_=ℕ_ 0) l ≟ tt
when checking that the expression ? has type -product .l ≡ 0

我感谢任何帮助!

修改(回复1):

我将案子分成了洞并得到了:

-product-0 : ∀{l :  ℕ} → list-any (_=ℕ_ 0) l ≡ tt → -product l ≡ 0
-product-0 x = {!!}

这是我想要的吗?当我分手时,它填写了x。

它还可以看到:

Goal: -product .l ≡ 0

其中:

x  : list-any (_=ℕ_ 0) .l ≡ tt
.l :  ℕ

此时希望我解决的程序是什么?我怎么能显示

-product-0 x在逻辑上等同于-product .l ≡ 0

1 个答案:

答案 0 :(得分:2)

  

我试图理解这一部分:list-any( =ℕ 0)l≡tt

     

是( =ℕ 0)≡(pred:A→)和l≡(l:A)?

您更正了_=ℕ_ 0代替pred_=ℕ_ 0表示将函数_=ℕ_应用于0的结果。由于_=ℕ_是一个二元函数,因此将其应用于一个参数会产生函数ℕ -> ,这是list-any所期望的。

关于其他问题,您尝试在l上进行模式匹配,但它是隐含的:在您的示例中l1实际上表示list-any (_=ℕ_ 0) l ≡ tt论证,因为那是第一个明确的论证。您必须使用括号引入隐式参数:

-product-0 : ∀{l :  ℕ} → list-any (_=ℕ_ 0) l ≡ tt → -product l ≡ 0
-product-0 {l1} = {!!}

编辑:

我认为你是在Emacs agda模式下。查看上下文时,隐式参数以点为前缀,如.l : ℕ。如果您使用的是新版Agda,如果要在.l上拆分,请在洞中写下{ .l },然后点击C-c-c。另一个解决方案是使用括号在函数定义中引入参数,就像我上面写的那样,然后在洞中写{ l1 },然后点击C-c-c。

或者,您可以使list参数显式化并保存括号:

-product-0 : (l :  ℕ) → list-any (_=ℕ_ 0) l ≡ tt → -product l ≡ 0
-product-0 l = ?

请记住,在函数定义中,没有括号的参数是显式参数,您可以在它们之前或之间插入与它们在类型中出现的顺序相对应的隐式参数。您还可以通过类型中的名称引用隐式参数。例如:

foo : Nat -> {l : list Nat} -> Nat -> Nat
foo n m = ?  -- now "n" refers to the first Nat and "m" refers to the last argument

foo : Nat -> {l : list Nat} -> Nat -> Nat
foo n {l} m = ? -- now "l" refers to the list.

foo : Nat -> {l : list Nat} -> Nat -> Nat
foo n {l = list} m = ? -- refer to "l" by the name "list" here.