私は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 つに結合されていることを確認するにはどうすればよいでしょうか。建設中にこれが真実であることを確認したいと思います。今は型クラスの解決が難しいことは理解できますが、イドリスには、後で構築中に解決できるようにしてもらいたいと思っています。これどうやってするの?
コードは実際には必要ありません。考え方の方向性には非常に満足しています。