1

私は推論したいプログラミングランゲージのASTのデータ型を持っていますが、ASTのコンストラクタは約10種類あります。Agdaにおける決定的な平等はn^2未満の場合?

data Term : Set where 
    UnitTerm : Term 
    VarTerm : Var -> Term 
    ... 
    SeqTerm : Term -> Term -> Term 

私は、この言語の構文木のために決定的な平等性を持つ関数を書こうとしています。理論的にはこれは簡単です。複雑すぎることはありません。単純なデータがASTに保存されているだけです。

問題は、このような関数を書くには、約100個のケースが必要だと考えられます。コンストラクタごとに10個のケースが必要です。

eqDecide : (x : Term) -> (y : Term) -> Dec (x ≡ y) 
    eqDecide UnitTerm UnitTerm = yes refl 
    eqDecide UnitTerm (VarTerm x) = Generic.no (λ()) 
    ... 
    eqDecide UnitTerm (SeqTerm t1 t2) = Generic.no (λ()) 
    EqDecide (VarTerm x) UnitTerm = Generic.no (λ()) 
    ... 

問題は、重複したケースがたくさんあることです。可能な他のコンストラクタは統合できないので、コンストラクタが一致する最初のパターンマッチの後、理想的にはアンダースコアと一致させることができますが、私はそれを行うことはできません。

私は、平等を導くためにthis libraryを使用しようとしました。私は厳しい陽性で問題に遭遇しているだけでなく、いくつかの一般的なエラーを取得するのはかなり難しいです。 The Agda Preludeにはこのためのいくつかの機能もありますが、かなり未熟で、標準ライブラリから必要なものが欠けています。

人々はどのように決定的な平等をどのように実践していますか?彼らはそれを吸うと100のすべての場合を書き込むか、または私は行方不明だトリックですか?これはちょうど言語の新しさが見える場所ですか?

+0

あなたの 'Term'型は非常にバニラに見えますが、' Generic'パッケージはそれで動作しませんでした。それがいかに失敗したかについての詳細を投稿できますか? – Cactus

+0

@Cactus、問題は[this](https://github.com/effectfully/Generic/issues/2)の問題で説明されていると思います。 ** jmite **、他の問題がある場合は、より多くの問題を開いてください、私はあなたを助けてくれることをうれしく思います。 UlfのPreludeがあなたにふさわしくない理由を明確にすることはできますか?また、Preludeに欠けている機能を追加するように要求するかもしれません。標準のライブラリから単にコピーして追加することも可能です。問題自体に関しては、はい、人々は手作業ですべての定型文を書くか、外部ツールを使用して生成する傾向があります。 – user3237465

+0

@ user3237465:リンクされた問題は、いくつかのコンストラクタが '間接誘導性'のパラメータを持つデータ型に関するものです。だから彼が 'SeqTerm:List Term - > Term'を持っていたら、その問題が適用されるかもしれない。問題の例は 'SeqTerm:Term - > Term - > Term'に直接誘導されます。 – Cactus

答えて

2

あなたはリフレクションを使用しないよう、まだ例のリニア数で決定可能平等を証明したい場合は、次のアプローチを試みることができる:

  1. は機能embed : Term → Nat(または平等を決定可能いる他のいくつかのタイプを定義します。ラベル付きツリーなどの証明が容易です)。
  2. あなたの関数が実際に注入的であることを証明してください。
  3. 関数が、結果の型に決定的な等価性を持ち、Termで決定可能な等価性を終えるために注入関数であるという事実を利用してください(例えば、標準ライブラリのRelation.Nullary.Decidablevia-injection参照)。
+1

「Nat」はそこに「用語」があり、すべてが自動的に派生していることを除いて、私がジェネリックライブラリでやっているのは正確です。また、命題の平等を扱う 'via-inject'の周りに便利なラッパーは見つからなかったので、ここでは[1](https://github.com/effectfully/Generic/blob/master/Lib/Decidable.agda #L38)に興味がある場合は、 – user3237465

+0

私は間違っていると思われるようですが、何か愚かなことをすることなく「via-injection」(https://github.com/agda/agda-stdlib/blob/master/src/Data/Nat.agda#L27)を誤解しているようです。 – user3237465

関連する問題