2016-07-16 11 views
1

Coqでは不可能な印象を受けました。例Coq:複雑な式間の強制/サブタイプ化

Parameter Arg: Type. 
Parameter F X XP: Arg. 
Parameter S P I PLS PI: Arg -> Type. 
Parameter tree car: P X. 
Parameter mary john: PLS XP. 
Parameter c: PLS XP -> P XP. 
Coercion c: PLS XP >-> P XP. (*Syntax error: '>->' expected after [vernac:class_rawexpr] (in [vernac:gallina_ext]).*) 

そうではないだけ>->へ次式の型が設定し、タイプやプロップでなければならないために、表現自体も文法的に基本(ガリーナで「rawexpressions」?)でなければなりませんか?これを回避する方法。私は複雑な表現の間に強要を形成することができますか? Coqにサブタイプを定義する別の方法がありますか?複雑な式を扱う方法ですか?

Let nui := PLS XP. 
Let hui := P XP. 
Parameter c: nui -> hui. 
Coercion c: nui >-> hui. 
Parameter st: P XP -> Type. 
Check st (c mary). (*st mary : Type*) 
Check st mary. (*Error: The term "mary" has type "PLS XP" while it is expected to have type "P XP".*) 

答えて

1

IMVHO、問題の設定が非常に複雑に見えています。私はこのモデリング方法が効果的であるとは確信していません。

実際にそのルートに行きたい場合、強制は非常に特別なルールがあります。それらを使用する場合は、マニュアルのchapter 18に精通している必要があります。

Parameter Arg: Type. 
Parameter F X XP: Arg. 
Parameter S P I PLS PI: Arg -> Type. 
Parameter tree car: P X. 
Parameter mary john: PLS XP. 
Parameter c: PLS XP -> P XP. 

Inductive p_wrap := p_wrap_C : PLS XP -> p_wrap. 
Coercion u_cast x := match x with | p_wrap_C u => u end. 
Coercion c_cast x := match x with | p_wrap_C u => c u end. 

Parameter st: P XP -> Type. 
Definition Mary := p_wrap_C mary. 
Check st (c Mary). 
Check st Mary. 

YMMV:特に、私はあなたには、いくつかの包装を追加する必要がありますので、パラメータはソースクラスを作ることができないと思います。 ssreflect docにある一般的なsubTypeクラスは、ジェネリック強制フレームワークを作成する方法についていくつかの助けを与えるかもしれないことに注意してください。

+0

グッド!私は、あなたが以前の関数宣言を使って強制的に強制を定義できるかはわかりませんでした。すべてこれは実際に複雑です(それは主に私とマニュアルの誤りです)。私は[第18章で何かを試した。例)(https://coq.inria.fr/refman/Reference-Manual021.html#sec674)(おそらく何らかの睡眠の後に答えに入ります) – jaam

+0

強制を定義することは非常に混乱します: 'Parameter c: PLS XP - > P XP。強制c:PLS> - > P.(*メッセージ:cは統一継承条件を尊重しません。 (* c *)グラフを印刷します。 (* [c]:PLS> - > P *) 'ですが、強制はありません:' Check mary:P XP。 (*エラー: "mary"という言葉には "PLS XP"というタイプがありますが、 "P XP"というタイプがあります。*) '本当の問題は統一的な継承条件を満たしていることです。 'P x'は' P x'、 'L x'と' S x'の交点である 'PLS x'のスーパーセットです。だから、私は "c"が "明示的に指定されなければならない強制"であるとふりをするかもしれません。 – jaam

+0

私は非常に混乱していると同意します。実際には、「統一継承を尊重しない」とは、「あなたの強制は適用のために決して考慮されません。 – ejgallego

1

これを試してみると、解決策は驚くほど簡単でした。

  1. あなたは機能、あなたは強制でにしたい関数を定義する必要があります"uniform inheritance condition"を破る避けるために
  2. を作品Coercion c: PLS >-> Pすなわち、互いの方へを強制することができます:二つのステップ、私の質問が欠落していましたがありましたその一般的な( "FORALL")フォーム要するに

Parameter Arg: Type. 
Parameter F X XP: Arg. 
Parameter S P I PLS PI: Arg -> Type. 
Parameter tree car: P X. 
Parameter mary john: PLS XP. 
Parameter c: forall x:Arg, PLS x -> P x. 
Coercion c: PLS >-> P. 
Check mary:P XP.