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".*)
グッド!私は、あなたが以前の関数宣言を使って強制的に強制を定義できるかはわかりませんでした。すべてこれは実際に複雑です(それは主に私とマニュアルの誤りです)。私は[第18章で何かを試した。例)(https://coq.inria.fr/refman/Reference-Manual021.html#sec674)(おそらく何らかの睡眠の後に答えに入ります) – jaam
強制を定義することは非常に混乱します: '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
私は非常に混乱していると同意します。実際には、「統一継承を尊重しない」とは、「あなたの強制は適用のために決して考慮されません。 – ejgallego