ฉันอยากรู้. ฉันได้ทำงานกับประเภทข้อมูลนี้ใน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
.
Coqกำลังส่งเสียงครวญคราง มันไม่ชอบนวกรรมิกตัวสุดท้ายและพูดบางสิ่งที่ฉันไม่เข้าใจหรือเห็นด้วยอย่างสมบูรณ์:
Error: Non strictly positive occurrence of "exptree" in "exptree (exptree a) -> exptree a".
สิ่งที่ฉันสามารถเข้าใจได้คือประเภทอุปนัยที่ใช้การปฏิเสธในคำจำกัดความของพวกเขาเช่นtype 'a term = Constructor ('a term -> …)
ถูกปฏิเสธเพราะพวกเขาจะนำไปสู่สัตว์ที่ไม่ได้ก่อตั้งขึ้นอย่างน่าเกลียดเช่น (ไม่พิมพ์) terms- ข้อตกลง อย่างไรก็ตามexptree
ประเภทข้อมูลนี้ดูเหมือนจะไม่น่ากลัวพอ: ดูที่คำจำกัดความของOCamlอาร์กิวเมนต์ของมัน'a
ไม่เคยถูกใช้ในตำแหน่งเชิงลบ
ดูเหมือนว่าCoqอยู่ตรงนี้มากเกินไป ดังนั้นจึงมีปัญหากับประเภทข้อมูลอุปนัยเฉพาะนี้หรือไม่? หรือCoqอาจจะได้รับอนุญาตมากกว่านี้เล็กน้อย?
นอกจากนี้แล้วผู้ช่วยพิสูจน์คนอื่น ๆ พวกเขาสามารถรับมือกับคำจำกัดความอุปนัยเช่นนั้นได้หรือไม่?