मैं एक (छोटे) प्रोग्रामिंग भाषा (ब्रूनो डी Fraine, एरिक अर्नस्ट, मारियो Südholt द्वारा Featherweight जावा के एक कार्यान्वयन विस्तार) के एक मॉडल को लागू करने के Coq सबूत सहायक का उपयोग कर रहा हूँ। एक चीज जो induction
रणनीति का उपयोग करते समय आती रहती है, यह है कि प्रकार के रचनाकारों में लिपटे जानकारी को कैसे संरक्षित किया जाए।प्रेरण का उपयोग करते समय जानकारी रखते हुए?
मैं के रूप में
Inductive sub_type : typ -> typ -> Prop :=
| st_refl : forall t, sub_type t t
| st_trans : forall t1 t2 t3, sub_type t1 t2 -> sub_type t2 t3 -> sub_type t1 t3
| st_extends : forall C D,
extends C D ->
sub_type (c_typ C) (c_typ D).
Hint Constructors sub_type.
जहां extends
वर्ग विस्तार प्रणाली जावा के रूप में देखा है एक उप टाइपिंग कार्यान्वित प्रोप है, और typ
उपलब्ध प्रकार के दो अलग अलग प्रकार का प्रतिनिधित्व करता है,
Inductive typ : Set :=
| c_typ : cname -> typ
| r_typ : rname -> typ.
एक जहाँ मैं प्रकार की जानकारी चाहते हैं के उदाहरण को संरक्षित किया जा रहा है जब
की तरह एक परिकल्पना परinduction
रणनीति का उपयोग करते हुए
जैसे
u : cname
v : cname
fsv : flds
H : sub_type (c_typ u) (c_typ v)
H0 : fields v fsv
============================
exists fs : flds, fields u (fsv ++ fs)
induction H.
छोड देता है u
और v
बारे में सभी जानकारी का उपयोग करने में। st_refl
मामले
u : cname
v : cname
fsv : flds
t : typ
H0 : fields v fsv
============================
exists fs : flds, fields u (fsv ++ fs)
हो जाता है आप जानकारी है कि u
और v
H
में typ
कंस्ट्रक्टर्स से जुड़े हुए हैं, और इस तरह t
करने के लिए, खो दिया है देख सकते हैं। इससे भी बदतर यह है कि इस कोक के कारण यह देखने में असमर्थ है कि u
और v
वास्तव में इस मामले में समान होना चाहिए।
H
Coq पर inversion
रणनीति का उपयोग करते समय देखकर कि u
और v
ही कर रहे हैं में सफल होता है। यही कारण है कि रणनीति नहीं लागू यहाँ हालांकि, के रूप में मैं प्रेरण परिकल्पना कि induction
st_trans
और st_extends
मामलों साबित करने के लिए उत्पन्न करता है की जरूरत है।
वहाँ एक रणनीति है कि दोनों प्रेरण परिकल्पना पैदा करते हैं और क्या कंस्ट्रक्टर्स में लपेटा जाता है के बारे में जानकारी को नष्ट किए बिना समानताओं प्राप्त करने के लिए inversion
और induction
का सबसे अच्छा जोड़ती है? वैकल्पिक रूप से, क्या मुझे आवश्यक जानकारी मैन्युअल रूप से प्राप्त करने का कोई तरीका है? info inversion H
और info induction H
दोनों बताते हैं कि परिवर्तनों का एक बहुत (विशेष रूप से inversion
के साथ) स्वचालित रूप से लागू कर रहे हैं। इन्होंने change
रणनीति के साथ let ... in
निर्माण के साथ प्रयोग करने का नेतृत्व किया है, लेकिन बिना किसी प्रगति के।
@ माथियास: क्या 'निर्भर एच 0 सामान्यीकृत करता है। प्रेरण एच। मदद? यह सब कुछ है जो मैं स्वयं को कोक को खिला सकता हूं बिना किसी प्रस्ताव के (मैं आपके प्रश्न को भरने की अपेक्षा से अधिक परिभाषाओं को याद कर रहा हूं, मैं जावा की टाइप सिस्टम के साथ पर्याप्त परिचित नहीं हूं)। – Gilles
उसने कोक को सही काम करने के लिए राजी नहीं किया। मैंने एक ज़िप फ़ाइल बनाई है जिसमें केवल 'तथ्य' के साथ खेलने के लिए आवश्यक परिभाषाएं हैं जिनमें मुझे साबित करने में समस्या हो रही है: [Problem.v में परिभाषाएं और 'तथ्य', शेष सहायक हैं] (http://cs.au। dk/~ एमडीआई/coq_keeping_type_info_distilled.zip)। तुम्हारी सहायता सराहनीय है। – mdiin
@ माथियास: रिफ्लेक्सिविटी के लिए, आपको उपलब्ध बराबरता का उपयोग करके लक्ष्य को फिर से लिखना होगा। एक शॉट के लिए, मुझे समानता पर जोर देने के लिए यह सबसे आसान लगता है, फिर इसका उपयोग करें। यदि यह बहुत सारे सबूतों में आता है, तो आप सामान्य पैटर्न की तलाश करने वाली रणनीति को परिभाषित करना शुरू कर सकते हैं। – Gilles