পলিমারফিজম এবং ইন্ডাকটিভ ডেটাটাইপস


10

আমি কৌতুহলী. আমি ওসিএএমএলে এই ডেটাটাইপটিতে কাজ করছি :

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

তবে আমি কখনই কোকে এটি সংজ্ঞায়িত করতে সক্ষম হইনি :

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 -> …)প্রত্যাখ্যান করা হয়, কারণ তারা কুরুচিপূর্ণ অ-প্রতিষ্ঠিত প্রাণীর মতো (শিরোনামহীন) শর্তাবলীর দিকে নিয়ে যায়। তবে এই নির্দিষ্ট exptreeডেটাটাইপটি যথেষ্ট নিরীহ বলে মনে হচ্ছে: এর ওসিএএমএল সংজ্ঞাটি দেখে এর যুক্তি 'aকখনও নেতিবাচক অবস্থানে ব্যবহার করা হয় না।

দেখে মনে হয় কোক এখানে অত্যধিক সতর্ক। তাহলে কি এই বিশেষ ইনডাকটিভ ডেটাটাইপটিতে সত্যিই সমস্যা আছে? নাকি কোক এখানে আরও কিছুটা জায়েয হতে পারে ?

এছাড়াও, অন্যান্য প্রুফ সহকারীদের কী, তারা কি এ জাতীয় প্রস্তাবনামূলক সংজ্ঞা (প্রাকৃতিক উপায়ে) মোকাবেলা করতে সক্ষম?

উত্তর:


9

এটি বেশ কয়েকবার কক মেইলিং তালিকায় উঠে এসেছে, তবে আমি কখনই একটি চূড়ান্ত উত্তর দেখিনি। কোক সাধারণ হিসাবে সাধারণ হতে পারে না; (কোকুয়ান্ড, ১৯৯০) এবং (জিমনেজ, ১৯৯৯) (এবং তাঁর পিএইচডি থিসিস) এর বিধিগুলি আরও সাধারণ এবং কঠোর ইতিবাচকতার প্রয়োজন হয় না। ইতিবাচকতা যথেষ্ট নয়, তবে বাইরে যাওয়ার সময় Set; এই উদাহরণটি বেশ কয়েকটি আলোচনায় উঠে এসেছে :

Inductive Big : Type := B : ((B -> Prop) -> Prop) -> Big.

আপনার মতো সরল ডেটা স্ট্রাকচারের সাথে, প্রবর্তক প্রকারটি বাস্তবায়নটিকে আরও জটিল করে তোলার ব্যতীত অন্য কোনও সমস্যার কারণ হতে পারে না।

বহু ধরণের ফিক্সপয়েন্ট হিসাবে এটি সংজ্ঞায়িত করার মতো ধরণের সংজ্ঞা দেওয়ার একটি সাধারণ উপায় রয়েছে: এপসিলন omic অক্স্রোন th ম্যাথার্ম

F=ϵ+δ(F×F)+οid+FF

function ফাংশনটি সংজ্ঞায়িত করার চেষ্টা করার পরিবর্তে , । এর অর্থ স্ব-রচনাগুলির সংখ্যাকে এনকোড করে এমন ধরণের একটি পূর্ণসংখ্যা প্যারামিটার যুক্ত করা ( , , , ইত্যাদি), এবং একটি সম্পূরক ইনজেকশন কন্সট্রাকটর ঘুরে মধ্যে ।exptree:aexptree(a)exptree,exptreeexptree,exptreeexptreeexptree,exptree0(a)=aexptree1(a)=exptree(a)exptree2(a)=exptree(exptree(a))aexptree0(a)=a

Inductive et : nat -> Type -> Type :=
  | alpha : forall a, a -> et 0 a                      (*injection*)
  | omicron : forall n a, et n a -> et (S n) a         (**)
  | epsilon : forall (S n) a, et (S n) a
  | delta : forall n a, et (S n) a -> et (S n) a -> et (S n) a
  | iota : forall n a, et (S (S n)) a -> et (S n) a
.

আপনি মানগুলি সংজ্ঞায়িত করতে এবং সেগুলিতে কাজ করতে এগিয়ে যেতে পারেন। কক প্রায়শই খুনিটিকে নির্ধারণ করতে সক্ষম হবে। Set Implicit Argumentsএই সংজ্ঞা prettier করা হবে।

Definition exptree := et 1.
Definition et1 : exptree nat :=
  delta _ _ (omicron _ _ (alpha _ 42)) (epsilon _ _).
Definition et2 : exptree nat := iota _ _ (omicron _ _ et1).

আপনি 1 যুক্তি হ্রাস করতে পছন্দ যাতে exptreeহয় et 0। এই অনেক সরিয়ে ফেলা S nসংজ্ঞা, যা কিছু প্রমাণাদি সহজ করতে পারে, কিন্তু এটা বিভাজন প্রত্যেক কন্সট্রাকটর যে লাগে পুনরাবৃত্তি মামলা থেকে প্রাথমিক ক্ষেত্রে প্রয়োজন একটি আর্গুমেন্ট মধ্যে (পরিবর্তে জন্য একটি একক ইনজেকশন কন্সট্রাকটর যোগ করার )। এই উদাহরণে, বিভক্ত করার জন্য কেবলমাত্র একক নির্মাণকারী রয়েছে, সুতরাং এটি একটি ভাল পছন্দ হওয়া উচিত।aa

Inductive et : nat -> Type -> Type :=
  | omicron_0 : forall a, a -> et 0 a
  | omicron_S : forall n a, et n a -> et (S n) a
  | epsilon : forall n a, et n a
  | delta : forall n a, et n a -> et n a -> et n a
  | iota : forall n a, et (S n) a -> et n a
.
Definition exptree := et 0.
Definition et1 : exptree nat :=
  delta _ _ (omicron_0 _ 42) (epsilon _ _).
Definition et2 : exptree nat :=
  (iota _ _ (omicron_S _ _ et1)).

আমি মনে করি রাল্ফ ম্যাটেস আরও সাধারণ আকারে প্রস্তাবিত একই নীতি ।

তথ্যসূত্র

থিয়েরি কোকোয়ান্ড এবং ক্রিস্টিন পলিন। সূক্ষ্মভাবে সংজ্ঞায়িত প্রকার । ইন COLOG'88 প্রসিডিংস , LNCS 417, 1990 [ স্প্রিঙ্গের ] [ গুগল ]

এডুয়ার্ডো গিমেনেজ টাইপ থিওরিতে স্ট্রাকচারাল রিকার্সিভ সংজ্ঞা । ইন ICALP'98: 25th অটোমাটা, ভাষা এবং প্রোগ্রামিং এর উপর আন্তর্জাতিক colloquium প্রসিডিংস। স্প্রিঞ্জার-ভার্লাগ, 1998 [[ পিডিএফ ]


8

রাল্ফ ম্যাথস বর্ণনা করেছেন কীভাবে "আইট্রেটেড পাওয়ারের জন্য একটি ডেটাস্ট্রাকচার" ( কোড , কাগজ ) এ কোকের মধ্যে এই জাতীয় প্রকারের অনুকরণ করা যায় ।


6

কোক প্রথম কাজগুলির মধ্যে একটি হ'ল ইনডাকটিভ টাইপের সাথে সম্পর্কিত ইন্ডাকশন নীতিটি তৈরি করা যা আপনি কেবল সংজ্ঞায়িত করেছেন এবং অন্তর্নিহিত আনয়ন নীতিটি বোঝা একটি ভাল অনুশীলন।

উদাহরণস্বরূপ O : nat | S : nat -> natআনয়ন নীতি উত্পন্ন করবে P O -> (∀ n, P n -> P (S n)) -> ∀ n, P n

এর সাথে আনয়ন নীতিটি কী হবে iota? মনে হচ্ছে কোন সম্পৃক্ত নেই Pযে বিষয়ে কথা বলতে সক্ষম হবে P tএবং P (iota t), কারণ এটি সম্পর্কে কথা বলা উচিত exptree a, exptree (exptree a), exptree (exptree (exptree a))...

এছাড়াও Omicronএকই জিনিস আছে কিন্তু টাইপ ছোট প্রতিটি সময়। আপনার অনুভূতি হওয়া উচিত যে একটি ছোট ধরণের এবং বড় ধরণের উভয়েরই রেফারেন্স থাকা বিষয়গুলিকে অগোছালো করে তুলবে। (এটি বলেছেন, Omicronসঠিক উপায়)

এটি সঠিক মানদণ্ড নয় যা বলে যে সংজ্ঞাটি কেন গ্রহণ করা উচিত নয় তবে এটি কেন এটি আমার কাছে খারাপ মনে করে তা ব্যাখ্যা করে।

exptreeআপনি এক্সপ্রেশনের জন্য ব্যাকরণ, জিনিস থেকে পুরোপুরি অন্য নও নির্মাণ করা হয় মত মনে হয় যে রিকার্সিভ। আপনি কি এর সাথে কিছু সহায়তা চান?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.