मैं उत्सुक हूँ। मैं इस datatype पर OCaml में काम कर रहा हूँ :
type 'a exptree =
| Epsilon
| Delta of 'a exptree * 'a exptree
| Omicron of 'a
| Iota of 'a exptree exptree
जिसे स्पष्ट रूप से टाइप किए गए पुनरावर्ती कार्यों (एक विशेषता जिसे हाल ही में जोड़ा गया है) का उपयोग करके हेरफेर किया जा सकता है। उदाहरण:
let rec map : 'a 'b. ('a -> 'b) -> 'a exptree -> 'b exptree =
fun f ->
begin function
| Epsilon -> Epsilon
| Delta (t1, t2) -> Delta (map f t1, map f t2)
| Omicron t -> Omicron (f t)
| Iota tt -> Iota (map (map f) tt)
end
लेकिन मैं कभी भी इसे Coq में परिभाषित नहीं कर पाया :
Inductive exptree a :=
| epsilon : exptree a
| delta : exptree a -> exptree a -> exptree a
| omicron : a -> exptree a
| iota : exptree (exptree a) -> exptree a
.
कोयल रो रही है। यह अंतिम रचनाकार को पसंद नहीं करता है, और ऐसा कुछ कहता है जिसे मैं पूरी तरह से नहीं समझता या इससे सहमत हूं:
Error: Non strictly positive occurrence of "exptree" in "exptree (exptree a) -> exptree a".
मैं जो समझ सकता हूं, वह यह है कि आगमनात्मक प्रकारों का उपयोग उनकी परिभाषा के अंदर एक नकार का उपयोग करते हुए type 'a term = Constructor ('a term -> …)
खारिज कर दिया जाता है, क्योंकि वे बदसूरत गैर-स्थापित जानवरों की तरह होंगे (अनकैप्ड) λ-terms। हालाँकि यह विशेष रूप से exptree
डेटाटाइप सहज रूप से पर्याप्त लगता है: इसकी OCaml परिभाषा को देखते हुए, इसके तर्क 'a
का उपयोग कभी भी नकारात्मक स्थिति में नहीं किया जाता है।
ऐसा लगता है कि यहाँ पर Coq ज्यादा व्यस्त है। तो क्या वास्तव में इस विशेष प्रेरक डेटाटाइप के साथ कोई समस्या है? या कोक यहाँ कुछ और अधिक अनुमति दे सकता है?
इसके अलावा, अन्य सबूत सहायकों के बारे में क्या, वे इस तरह के एक प्रेरक परिभाषा (प्राकृतिक तरीके से) का सामना करने में सक्षम हैं?