簡體   English   中英

Agda:未能解決以下約束:P x <= _X_53(在 _X_53 上被阻止)

[英]Agda: Failed to solve the following constraints: P x <= _X_53 (blocked on _X_53)

我在閱讀HoTT書時正在編寫 Agda 代碼。 我被困在引理 2.3.9 上:

data _≡_ {X : Set} : X -> X -> Set where
  refl : {x : X} -> x ≡ x
infix 4 _≡_

-- Lemma 2.1.2
_·_ :  {A : Set} {x y z : A} -> x ≡ y -> y ≡ z -> x ≡ z
refl · refl = refl

-- Lemma 2.3.1
transp : {A : Set} {P : A -> Set} {x y : A} -> x ≡ y -> P x -> P y
transp refl f = f

lemma2'3'9 : {A : Set}{P : A -> Set}{x y z : A}{p : x ≡ y}{q : y ≡ z}{u : P x} -> 
             (transp q (transp p u)) ≡ (transp (p · q) u)
lemma2'3'9 {p = refl} {q = refl} = ?

使用 Adga Emacs 模式進行類型檢查會出現以下錯誤:

?0 : transp refl (transp refl u) ≡ transp (refl · refl) u
_X_53 : Set  [ at /home/user/prog/agda/sample.agda:12,38-39 ]

———— Errors ————————————————————————————————————————————————
Failed to solve the following constraints:
  P x =< _X_53 (blocked on _X_53)

問題

  1. 什么是'_X_53',為什么大於或等於(P x)?
  2. 我怎樣才能擺脫這個錯誤?

注意我在 Coq 中寫了一個引理 2.3.9 的工作示例,所以我假設它在 Agda 中是可能的。

Inductive eq {X:Type} (x: X) : X -> Type :=
  | refl : eq x x.
Notation "x = y" := (eq x y)
                       (at level 70, no associativity)
                     : type_scope.

Definition eqInd{A} (C: forall x y: A, x = y -> Type) (c: forall x: A, C x x (refl x)) (x y: A): forall p: x = y, C x y p :=
  fun xy: x = y => match xy with
            | refl _ => c x
            end.

Definition dot'{A}{x y: A}: x = y -> forall z: A, y = z -> x = z :=
  let D := fun x y: A => fun p: x = y => forall z: A, forall q: y = z, x = z in
  let d: forall x, D x x (refl x) := let E: forall x z: A, forall q: x = z, Type := fun x z: A => fun q: x = z => x = z in
                                let e := fun x => refl x
                                in  fun x z => fun q => eqInd E e x z q
  in fun p: x = y => eqInd D d x y p.

(* Lemma 2.1.2 *)
Definition dot{A}{x y z: A}: x = y -> y = z -> x = z :=
  fun p: x = y => dot' p z.

Definition id {A} := fun a: A => a.

(* Lemma 2.3.1 *)
Definition transp{A} {P: A -> Type} {x y: A}: x = y -> P x -> P y :=
  fun p =>
  let D := fun x y: A => fun p: x = y => P x -> P y in
  let d: forall x, D x x (refl x) := fun x => id
  in  eqInd D d x y p.

Lemma L_2_3_9{A}{P: A -> Type}{x y z: A}{p: x = y}{q: y = z}{u: P x}:
  transp q (transp p u) = transp (dot p q) u.
Proof.
  unfold transp, dot, dot'.
  rewrite <- q.
  rewrite <- p.
  reflexivity.
  Qed.

_X_53是元變量,即術語的未知部分。 為了弄清楚術語的這個未知部分,Agda 嘗試解析元變量。 她通過查看元變量出現的上下文、從該上下文導出約束並確定滿足約束的元變量的可能候選解決方案來做到這一點。

除此之外,Agda 使用元變量來實現隱式參數。 每個隱式參數都被一個元變量替換,然后 Agda 嘗試在包含剩余參數的上下文中解析該元變量。 例如,這就是隱式參數的值可以從其余參數中導出的方式。

有時,Agda 無法找出隱含的論點,盡管人們認為她應該能夠。 即,Agda 無法解析隱式參數的元變量。 這是她需要一點幫助的時候,即,我們必須明確指定一個或多個隱含參數。 這是@gallais 在評論中建議的。

=<比較兩種類型。 A =< B意味着A類型的東西可以放在需要B類型的東西的地方。 所以,如果你有一個需要B的函數,你可以給它一個A並且它會輸入檢查。 我認為這主要用於 Agda 的大小類型。 我認為,在您的情況下,這可以理解為類型相等。

但回到錯誤信息。 Agda 找不到_X_53的解決方案。 需要滿足的約束是P x =< _X_53 如果在您的情況下, =<是類型相等,那么為什么 Agda 不簡單地將_X_53設置為P x

根據我非常有限的理解,原因是高階統一,這有點——用一個非常專業的術語來說——反復無常和挑剔的野獸。 _X_53在這里並不是全部真相。 元變量可以是函數,因此具有參數。 根據 Agda 調試日志,手頭的實際統一問題是統一_X_53 AP xxP x 如果我沒記錯的話,那么前者中的兩個x是有問題的。 不過,把這個和一粒鹽放在一起。 我不是類型理論家。

長話短說,有時 Agda 無法找出隱含的論點,因為統一失敗了,而且很難理解究竟是為什么。

最后,一些相關的東西:下面的文章討論了一些關於使用隱式參數的最佳實踐: Inference in Agda

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM