3

私はidrisにaaデータ型を持っています:

data L3 = Rejected | Unproven | Proven

ユニティ、ラティス、グループ、およびその他のプロパティを持つリングであることを確認しました。

ここで、注入したステートメントの式を保持するオブジェクトを作成したいと思います。すべての操作を表す 4 つのカテゴリから始めたので、そこから適切な構文ツリーが得られます。例えば:

Om [Proven, Unproven, Op [Proven, Oj [Unproven, Proven]] 

これは実際の表現ではありません。必要な醜い部分をいくつか取り除きましたが、達成しようとしていることのアイデアが得られます。上記は次と同等です。

meet Proven (meet Unproven (Proven <+> (join Unproven Proven)))

データ型を 1 つに結合できることがわかりました。そこに到達するために、正しいクラス インスタンスを選択する関数を作成しました。

%case data Operator = Join | Meet | Plus | Mult

classChoice : (x: Operator) -> (Type -> Type)
classChoice Join = VerifiedJoinSemilattice
classChoice Meet = VerifiedMeetSemilattice
classChoice Plus = VerifiedGroup
classChoice Mult = VerifiedRing

そのため、型内のすべてのものがこれら 4 つの操作のいずれかを表すことを保証できます。

 %elim data LogicSyntacticalCategory : classChoice op a => (op : Operator) -> (a : Type) -> Type where
       LSCEmpty : LogicSyntacticalCategory op a

次のように不平を言うでしょう:

When elaborating type of logicCategory.LSCEmpty:
Can't resolve type class classChoice op ty

ここで私の質問: データ型のオブジェクトが検証され、4 つの個別のデータ型が 1 つに結合されていることを確認するにはどうすればよいでしょうか。建設中にこれが真実であることを確認したいと思います。今は型クラスの解決が難しいことは理解できますが、イドリスには、後で構築中に解決できるようにしてもらいたいと思っています。これどうやってするの?

コードは実際には必要ありません。考え方の方向性には非常に満足しています。

4

1 に答える 1

3

最初に 2 つの小さな問題... -> a -> ...... -> (a : Type) -> ...あります。

警告: Idris 0.9.18 を使用していますが、Elab 証明の書き方がまだわかりません。

リポジトリ: https://github.com/runKleisli/idris-classdata

これらと同じ型シグネチャを持つ通常の関数では、関数を定義する際に戦術を使用して型クラスの解決を支援する機会があります。しかし、データ型とそのコンストラクターでは、それらを宣言する機会しかないため、解決を支援する機会はありません。ここでは、そのようなガイド付き解決策が必要だったようです。

の定義では のclassChoice op a前に証明されたインスタンスが必要であり、このインスタンスを取得していないようです。このようなデータ型の型のクラス制約は、通常、暗黙の引数のようにコンストラクターのコンテキストに自動的に導入されますが、これはここで失敗したようで、インスタンスは必要な型とは異なる型であると見なされます。宣言によって導入された目標を満たさないコンストラクターに対して想定されるそのインスタンスLogicSyntacticleCategory op aLSCEmptyLogicSyntacticleCategory op aエラーのようです。リポジトリ内の例の 1 つでは、これらの予期せぬ不一致の目標と仮定は自動的にペアリングできるように見えますが、データ型とコンストラクター宣言の状況ではそうではありません。正確な問題を把握することはできませんが、型シグネチャで同じ条件を持つ単純な関数宣言には当てはまらないようです。

いくつかの解決策がリポジトリで提供されていますが、最も簡単な方法は、 のインスタンスが必要であるという制約引数を type の暗黙の引数に置き換えてclassChoice op aclassChoice op aLogicSyntacticleCategory

feat : Type
feat = ?feat'

feat' = proof
  exact (LogicSyntacticleCategory Mult ZZ {P=%instance})

データ型へのメイン インターフェイスに制約引数を設定する場合はLogicSyntacticleCategory : (op : Operator) -> (a : Type) -> {p : classChoice op a} -> Type、関数での定義をラップできます。

logicSyntacticleCategory : classChoice op a => (op : Operator) -> (a : Type) -> Type
logicSyntacticleCategory = ?mkLogical

mkLogical = proof
    intros
    exact (LogicSyntacticleCategory op a {P=constrarg})

フォームの型を作りたいときは、LogicSyntacticleCategory op a前と同じように評価しますが、

feat' = proof
  exact (logicSyntacticleCategory Mult ZZ)
  exact Mult
  exact ZZ
  compute
  exact inst -- for the named instance (inst) of (classChoice Mult ZZ)

匿名インスタンスの場合、最後の行が削除されます。

于 2016-02-21T18:37:04.740 に答える