私は推論したいプログラミングランゲージの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のすべての場合を書き込むか、または私は行方不明だトリックですか?これはちょうど言語の新しさが見える場所ですか?
あなたの 'Term'型は非常にバニラに見えますが、' Generic'パッケージはそれで動作しませんでした。それがいかに失敗したかについての詳細を投稿できますか? – Cactus
@Cactus、問題は[this](https://github.com/effectfully/Generic/issues/2)の問題で説明されていると思います。 ** jmite **、他の問題がある場合は、より多くの問題を開いてください、私はあなたを助けてくれることをうれしく思います。 UlfのPreludeがあなたにふさわしくない理由を明確にすることはできますか?また、Preludeに欠けている機能を追加するように要求するかもしれません。標準のライブラリから単にコピーして追加することも可能です。問題自体に関しては、はい、人々は手作業ですべての定型文を書くか、外部ツールを使用して生成する傾向があります。 – user3237465
@ user3237465:リンクされた問題は、いくつかのコンストラクタが '間接誘導性'のパラメータを持つデータ型に関するものです。だから彼が 'SeqTerm:List Term - > Term'を持っていたら、その問題が適用されるかもしれない。問題の例は 'SeqTerm:Term - > Term - > Term'に直接誘導されます。 – Cactus