2017-01-14 12 views
1

WindowsのAgda 2.5.1.1では、以下のコードをロードした後(チュートリアルhttps://github.com/k0001/tut-agda/blob/master/SetsParametric.agdaに対応)、Cc Cdの型チェックで[]の型がList₁ _A_2 _B_3になります式はtrue ∷ []のような構造化された式には合理的な型はなく、アンダースコアと数字だけが返されます(_5など)。どのような理由があるのでしょうか?agda - 相互式の式の型が見つかりません

以前のチュートリアルの演習はうまくいきました。

module Sets.Parametric where 

open import Sets.Enumerated using (Bool; true; false; ⊤; tt) 

data List₁ (A B : Set) : Set 
data List₂ (A B : Set) : Set 
data List₁ (A B : Set) where 
    [] :     List₁ A B 
    _∷_ : A → List₂ A B → List₁ A B 

data List₂ (A B : Set) where 
    _∷_ : B → List₁ A B → List₂ A B 

答えて

4

非オーバーロードされたコンストラクタはinferrable、ひいては[]の種類が推測されているが、オーバーロードされたコンストラクタはチェック可能ですので、あなたはタイプtrue ∷ []を推論することはできません - だけList₂ Bool Aに対してそれを確認してください。

そうでないと、オーバーロードされたコンストラクタの型指定による解決が複雑になります。例えば。 _∷_のタイプは最初の引数に依存する可能性があり、_∷_List₁またはList₂に属するかどうかを計算すると、延期される可能性のある2つの可能性のある統一問題(List₁List₂の1つ)ユーザが何を意味するのかが明らかになるまでメモリに座ってください。 Agdaはすでに多くのメタ変数を生成していますが、この数を増やす理由はなく、型のチェックが複雑になりすぎてこの便利な機能ではありません。

+0

ありがとうございます。もう1つのこと - 特定のタイプに対する式のチェックがどのように実行されるかはわかりません。 _C-c C-d_はここでは使用できません。 – veeco

+1

@veeco、最良の選択肢は、私が思うに、 'test:A; test = x'をコード内のバッファに挿入します。 (関数)モジュールからの定義(または、関数モジュールからのインポート)のような他のオプションがあります:∀{α} - >(A:Setα) - > A - > A; A∈x = x'を評価してから 'C-c C -n A∈x'を評価するが、この方法では、値が実際にタイプに対して首尾良くタイプチェックを行うことは必ずしも明らかではない。 Agdaの最近のバージョンでは、 '_:A;チェックを実行したいだけで、名前をバインドしない場合は、「_ = x」と入力します。 – user3237465

+0

ありがとう、私はあなたの助言から最も簡単な変形を使用しました: 'test:List1 Bool⊤; test = true∷(tt∷[]) 'を実行し、コマンド_C-c C-d test_が期待した答えを返しました。 – veeco

関連する問題