তাই আমি এটি সম্পর্কে আরও কিছুটা চিন্তা করেছি এবং কিছু অগ্রগতি করেছি। Set : Set
সংযুক্ত শৈলীতে মার্টিন-লফের আনন্দদায়ক সহজ (তবে অসঙ্গত) সিস্টেমকে এনকোড করার জন্য এখানে প্রথম ছুরিকাঘাত । এটি শেষ করার ভাল উপায় নয় তবে এটি শুরু করার সবচেয়ে সহজ জায়গা। এই ধরণের তত্ত্বের বাক্য গঠনটি কেবল ল্যাম্বডা-ক্যালকুলাস সহ প্রকার টিকা, পাই-প্রকার এবং একটি মহাবিশ্ব সেট রয়েছে।
টার্গেট টাইপ থিওরি
সম্পূর্ণতার জন্য, আমি বিধিগুলি উপস্থাপন করব। প্রসঙ্গের বৈধতা কেবলমাত্র বলেছে যে আপনি নতুন করে ভেরিয়েবলগুলি সংযুক্ত করে খালি থেকে প্রসঙ্গ তৈরি করতে পারবেন Set
।
G |- valid G |- S : Set
. |- valid G, x:S |- valid
এবং এখন আমরা বলতে পারি যে কোনও প্রদত্ত প্রসঙ্গে শর্তাদির জন্য প্রকারগুলি সংশ্লেষিত করতে এবং কীভাবে কোনওরকমের শর্তাদি রয়েছে তার গণ্যমূলক আচরণ পর্যন্ত পরিবর্তন করা যায়।
G |- valid G |- S : Set G |- T : Pi S \ x:S -> Set
G |- Set : Set G |- Pi S T : Set
G |- S : Set G, x:S |- t : T x G |- f : Pi S T G |- s : S
G |- \ x:S -> t : Pi S T G |- f s : T s
G |- valid G |- s : S G |- T : Set
G |- x : S G |- s : T
আসল থেকে কিছুটা ভিন্নতায়, আমি ল্যাম্বডাকে একমাত্র বাঁধাইকারী অপারেটর তৈরি করেছি, সুতরাং পাইয়ের দ্বিতীয় যুক্তিটি যেভাবে ইনপুটটির উপর নির্ভর করে ফেরতের ধরণটি নির্ভর করে তার একটি ফাংশন হওয়া উচিত। কনভেনশন দ্বারা (যেমন আগডায়, তবে দুঃখের সাথে হাস্কেল নয়) ল্যাম্বডা এর পরিধি যথাসম্ভব ডানদিকে প্রসারিত হয়েছে, সুতরাং আপনি যখন উচ্চতর অর্ডার অপারেটরের সর্বশেষ যুক্তি হন তখন আপনি প্রায়শই বিমূর্ততা বিস্মৃত রাখতে পারেন: আপনি দেখতে পাচ্ছেন যে আমি করেছি পাই এর সাথে আপনার আগদা টাইপ (x : S) -> T
হয়ে যায় Pi S \ x:S -> T
।
( ডিগ্রেশন । ল্যাম্বডায় টাইপ টীকাগুলি প্রয়োজনীয় যদি আপনি বিমূর্তির ধরণের সংশ্লেষ করতে সক্ষম হন তবে আপনি যদি আপনার মোডাস অপারেন্ডি হিসাবে চেক টাইপ করে চেক করতে স্যুইচ করেন তবে আপনার বিটা-রেডেক্স পরীক্ষা করার জন্য এখনও টীকাগুলির দরকার (\ x -> t) s
আছে, কারণ আপনার কোনও উপায় নেই as সামগ্রীর থেকে অংশগুলির প্রকারগুলি অনুমান করার জন্য I আমি আধুনিক ডিজাইনারদের ধরণগুলি পরীক্ষা করতে এবং বিটা-রেডেক্সগুলি খুব সিনট্যাক্স থেকে বাদ দেওয়ার পরামর্শ দিই))
( ডিগ্রেশন । এই সিস্টেমটি Set:Set
বিভিন্ন "মিথ্যা প্যারাডোক্সেস" এর এনকোডিংয়ের অনুমতি দেয়ায় বেমানান Mart আমরা জানি সবচেয়ে খারাপ বিষাক্ত নির্মাণ))
সংযুক্তকারী সিনট্যাক্স এবং সাধারণকরণ
যাইহোক, আমাদের দুটি অতিরিক্ত চিহ্ন রয়েছে, পাই এবং সেট, সুতরাং আমরা সম্ভবত এস, কে এবং দুটি অতিরিক্ত চিহ্নের সাথে একটি সংমিশ্রিত অনুবাদ পরিচালনা করতে পারি: আমি মহাবিশ্বের জন্য ইউ এবং পন্যের জন্য পি বেছে নিয়েছি।
এখন আমরা টাইপযুক্ত সংযুক্ত সিনট্যাক্স (ফ্রি ভেরিয়েবল সহ) সংজ্ঞা দিতে পারি:
data SKUP = S | K | U | P deriving (Show, Eq)
data Unty a
= C SKUP
| Unty a :. Unty a
| V a
deriving (Functor, Eq)
infixl 4 :.
নোট করুন যে আমি a
এই বাক্য গঠনতে টাইপের দ্বারা প্রতিনিধিত্ব করে মুক্ত ভেরিয়েবলগুলি অন্তর্ভুক্ত করার উপায়গুলি অন্তর্ভুক্ত করেছি । আমার পক্ষ থেকে একটি প্রতিচ্ছবি হওয়া ছাড়াও (নামের যোগ্য প্রতিটি সিনট্যাক্স return
এম্বেডিং ভেরিয়েবল এবং >>=
পারফিউমিং প্রতিস্থাপন সহ একটি মুক্ত মনাদ ), পদগুলিকে তাদের সংযুক্ত ফর্মের সাথে আবদ্ধ করে রূপান্তর করার প্রক্রিয়াতে মধ্যবর্তী পর্যায়ের প্রতিনিধিত্ব করা সহজ হবে না।
এখানে নর্মালাইজেশন:
norm :: Unty a -> Unty a
norm (f :. a) = norm f $. a
norm c = c
($.) :: Unty a -> Unty a -> Unty a
C S :. f :. a $. g = f $. g $. (a :. g)
C K :. a $. g = a
n $. g = n :. norm g
infixl 4 $.
(পাঠকের জন্য একটি অনুশীলন হ'ল সাধারণ ফর্মগুলির জন্য কোনও প্রকারের সংজ্ঞা দেওয়া এবং এই ক্রিয়াকলাপগুলির প্রকারগুলি তীক্ষ্ণ করা))
টাইপ থিওরি উপস্থাপন
আমরা এখন আমাদের টাইপ তত্ত্বের জন্য একটি সিনট্যাক্স সংজ্ঞায়িত করতে পারি।
data Tm a
= Var a
| Lam (Tm a) (Tm (Su a))
| Tm a :$ Tm a
| Pi (Tm a) (Tm a)
| Set
deriving (Show, Functor)
infixl 4 :$
data Ze
magic :: Ze -> a
magic x = x `seq` error "Tragic!"
data Su a = Ze | Su a deriving (Show, Functor, Eq)
আমি বেলগ্রার্ড এবং হুক পদ্ধতিতে (বার্ড এবং পেটারসনের জনপ্রিয় হিসাবে) একটি ডি ব্রুইজন সূচক উপস্থাপনা ব্যবহার করি। প্রকারটির Su a
তুলনায় আরও একটি উপাদান রয়েছে a
এবং আমরা এটি একটি বাইন্ডারের নিচে মুক্ত ভেরিয়েবলের ধরণ হিসাবে ব্যবহার করি Ze
, নতুন সীমাবদ্ধ ভেরিয়েবল Su x
হিসাবে এবং পুরানো মুক্ত ভেরিয়েবলের স্থানান্তরিত প্রতিনিধিত্ব হিসাবে x
।
সংযুক্তকারীদের শর্তাদি অনুবাদ করা
এবং এটি হয়ে গেলে, বন্ধনী বিমূর্তনের উপর ভিত্তি করে আমরা সাধারণ অনুবাদটি অর্জন করি ।
tm :: Tm a -> Unty a
tm (Var a) = V a
tm (Lam _ b) = bra (tm b)
tm (f :$ a) = tm f :. tm a
tm (Pi a b) = C P :. tm a :. tm b
tm Set = C U
bra :: Unty (Su a) -> Unty a
bra (V Ze) = C S :. C K :. C K
bra (V (Su x)) = C K :. V x
bra (C c) = C K :. C c
bra (f :. a) = C S :. bra f :. bra a
সংযুক্তকারীগুলি টাইপ করা হচ্ছে
অনুবাদটি আমরা সংযুক্তকারীগুলিকে যেভাবে ব্যবহার করি তা দেখায়, যা তাদের প্রকারগুলি কী হওয়া উচিত সে সম্পর্কে আমাদের যথেষ্ট ধারণা দেয়। U
এবং P
কেবল নির্ধারক সেট করা আছে, সুতরাং, অপরিকল্পিত প্রকারগুলি লিখে এবং পাইয়ের জন্য "আগদা স্বরলিপি" দেওয়ার অনুমতি দেওয়া উচিত, আমাদের উচিত
U : Set
P : (A : Set) -> (B : (a : A) -> Set) -> Set
K
Combinator কিছু টাইপ মান উত্তোলন করতে ব্যবহৃত হয় A
কিছু অন্যান্য টাইপ উপর একটি ধ্রুবক ফাংশন G
।
G : Set A : Set
K : (a : A) -> (g : G) -> A
S
Combinator একটি টাইপ, যার উপর যন্ত্রাংশ সব নির্ভর করে হতে পারে ধরে লিফট অ্যাপ্লিকেশন ব্যবহার করা হয়।
G : Set
A : (g : G) -> Set
B : (g : G) -> (a : A g) -> Set
S : (f : (g : G) -> (a : A g) -> B g a ) ->
(a : (g : G) -> A g ) ->
(g : G) -> B g (a g)
আপনি যদি প্রকারের দিকে তাকান S
, আপনি দেখতে পাবেন এটি প্রকারের তত্ত্বের প্রাসঙ্গিক প্রয়োগের নিয়মটি ঠিক বলেছে , তাই এটিই অ্যাপ্লিকেশন নির্মাণকে প্রতিফলিত করার উপযুক্ত করে তোলে। এটাই তার কাজ!
আমাদের তখন কেবল বন্ধ জিনিসগুলির জন্য আবেদন রয়েছে
f : Pi A B
a : A
f a : B a
তবে একটি ছিনতাই আছে। আমি সংযুক্তকারীগুলির প্রকারগুলি সাধারণ ধরণের তত্ত্বে লিখেছি, সংযুক্তকরণের তত্ত্ব নয়। ভাগ্যক্রমে, আমার কাছে একটি মেশিন রয়েছে যা অনুবাদটি তৈরি করবে।
একটি সম্মিলিত টাইপ সিস্টেম
U : U
P : PU(S(S(KP)(S(S(KP)(SKK))(S(KK)(KU))))(S(KK)(KU)))
G : U
A : U
K : P[A](S(S(KP)(K[G]))(S(KK)(K[A])))
G : U
A : P[G](KU)
B : P[G](S(S(KP)(S(K[A])(SKK)))(S(KK)(KU)))
S : P(P[G](S(S(KP)(S(K[A])(SKK)))(S(S(KS)(S(S(KS)(S(KK)(K[B])))(S(KK)(SKK))))
(S(S(KS)(KK))(KK)))))(S(S(KP)(S(S(KP)(K[G]))(S(S(KS)(S(KK)(K[A])))
(S(S(KS)(KK))(KK)))))(S(S(KS)(S(S(KS)(S(KK)(KP)))(S(KK)(K[G]))))
(S(S(KS)(S(S(KS)(S(KK)(KS)))(S(S(KS)(S(S(KS)(S(KK)(KS)))
(S(S(KS)(S(KK)(KK)))(S(KK)(K[B])))))(S(S(KS)(S(S(KS)(S(KK)(KS)))(S(KK)(KK))))
(S(KK)(KK))))))(S(S(KS)(S(S(KS)(S(KK)(KS)))(S(S(KS)(S(KK)(KK)))
(S(S(KS)(KK))(KK)))))(S(S(KS)(S(S(KS)(S(KK)(KS)))(S(KK)(KK))))(S(KK)(KK)))))))
M : A B : U
M : B
সুতরাং সেখানে আপনার এটি রয়েছে, তার সমস্ত অপঠনীয় গৌরব: একটি সংযুক্ত উপস্থাপনা Set:Set
!
এখনও কিছুটা সমস্যা আছে। সিস্টেমের বাক্য গঠনটি আপনাকে কেবল শর্তাবলী থেকে G
, A
এবং B
প্যারামিটারগুলির জন্য S
এবং অনুরূপভাবে অনুমান করার কোনও উপায় দেয় না K
। স্বতঃস্ফূর্তভাবে , আমরা টাইপিং ডেরিভেশনগুলি অ্যালগরিদমভাবে যাচাই করতে পারি , তবে আমরা কেবল মূল সিস্টেমের সাথে সংযুক্তকারী পদগুলি টাইপচেক করতে পারি না। যে কাজটি করতে পারে তা হ'ল টাইপেকেকারের ইনপুটটি এস এবং কে এর ব্যবহারগুলিতে টাইপ টীকাগুলি সহ্য করতে হবে, কার্যকরভাবে ডেরিভিশন রেকর্ড করা। কিন্তু এটি কীটপতঙ্গগুলির আরেকটি ক্যান ...
আপনি যদি শুরু করার জন্য যথেষ্ট আগ্রহী হন তবে এটি থামার জন্য ভাল জায়গা। বাকিটি "পর্দার পিছনে" স্টাফ।
সংযুক্তকারীদের প্রকারের উত্পাদন
প্রাসঙ্গিক ধরণের তত্ত্বের পদগুলি থেকে বন্ধনী বিমূর্ত অনুবাদ ব্যবহার করে আমি সেই সংযুক্তিগুলি তৈরি করেছি generated আমি কীভাবে এটি করেছি তা দেখানোর জন্য এবং এই পোস্টটি সম্পূর্ণ অর্থহীন নয়, আমাকে আমার সরঞ্জাম সরবরাহ করতে দিন।
আমি সংযোগকারীগুলির ধরণগুলি সম্পূর্ণরূপে তাদের পরামিতিগুলিতে বিমূর্তভাবে লিখতে পারি। আমি আমার হ্যান্ডি pil
ফাংশনটি ব্যবহার করি যা ডো এবং ডায়মন্ডের ধরণের পুনরাবৃত্তি এড়াতে পাই এবং ল্যাম্বডাকে একত্রিত করে এবং বরং সাহায্যে আমাকে ভেরিয়েবলগুলি বাঁধার জন্য হাস্কেলের ফাংশন স্পেস ব্যবহার করতে দেয়। সম্ভবত আপনি নিম্নলিখিত নিম্নলিখিত পড়তে পারেন!
pTy :: Tm a
pTy = fmap magic $
pil Set $ \ _A -> pil (pil _A $ \ _ -> Set) $ \ _B -> Set
kTy :: Tm a
kTy = fmap magic $
pil Set $ \ _G -> pil Set $ \ _A -> pil _A $ \ a -> pil _G $ \ g -> _A
sTy :: Tm a
sTy = fmap magic $
pil Set $ \ _G ->
pil (pil _G $ \ g -> Set) $ \ _A ->
pil (pil _G $ \ g -> pil (_A :$ g) $ \ _ -> Set) $ \ _B ->
pil (pil _G $ \ g -> pil (_A :$ g) $ \ a -> _B :$ g :$ a) $ \ f ->
pil (pil _G $ \ g -> _A :$ g) $ \ a ->
pil _G $ \ g -> _B :$ g :$ (a :$ g)
এগুলি সংজ্ঞায়িত করে, আমি প্রাসঙ্গিক মুক্ত সাবটারমগুলি বের করেছি এবং অনুবাদটির মাধ্যমে এগুলি চালিত করেছি।
একটি ডি ব্রুইজন এনকোডিং টুলকিট
কীভাবে তৈরি করবেন তা এখানে pil
। প্রথমত, আমি Fin
ভেরিয়েবলের জন্য ব্যবহৃত এক সেট সেটের একটি শ্রেণির সংজ্ঞা দিই । এই জাতীয় প্রতিটি emb
সেটের উপরের সেটে একটি কনস্ট্রাক্টর-সংরক্ষণকারী এডিং রয়েছে, এবং একটি নতুন top
উপাদান রয়েছে, এবং আপনি সেগুলি আলাদা করে বলতে পারেন: embd
ফাংশনটি আপনাকে জানায় যে কোনও মান এর চিত্রের মধ্যে রয়েছে কিনা emb
।
class Fin x where
top :: Su x
emb :: x -> Su x
embd :: Su x -> Maybe x
আমরা অবশ্যই এবং এর Fin
জন্য তাত্ক্ষণিকভাবে করতে পারিZe
Suc
instance Fin Ze where
top = Ze
emb = magic
embd _ = Nothing
instance Fin x => Fin (Su x) where
top = Su top
emb Ze = Ze
emb (Su x) = Su (emb x)
embd Ze = Just Ze
embd (Su x) = fmap Su (embd x)
দুর্বল ক্রিয়াকলাপের সাথে আমি এখন কম বা সমান সংজ্ঞা দিতে পারি ।
class (Fin x, Fin y) => Le x y where
wk :: x -> y
wk
ফাংশনের উপাদান এম্বেড করা উচিত x
হিসাবে বৃহত্তম উপাদান y
, যাতে অতিরিক্ত কিছু y
ছোট, এবং এইভাবে ডি Bruijn সূচক পদ, আরো স্থানীয়ভাবে আবদ্ধ।
instance Fin y => Le Ze y where
wk = magic
instance Le x y => Le (Su x) (Su y) where
wk x = case embd x of
Nothing -> top
Just y -> emb (wk y)
এবং একবার আপনি এটি বাছাই হয়ে গেলে, কিছুটা র্যাঙ্ক-এন স্কালডুজেরি বাকীটি করে।
lam :: forall x. Tm x -> ((forall y. Le (Su x) y => Tm y) -> Tm (Su x)) -> Tm x
lam s f = Lam s (f (Var (wk (Ze :: Su x))))
pil :: forall x. Tm x -> ((forall y . Le (Su x) y => Tm y) -> Tm (Su x)) -> Tm x
pil s f = Pi s (lam s f)
উচ্চতর অর্ডার ফাংশনটি আপনাকে কেবল ভেরিয়েবলের প্রতিনিধিত্ব করার জন্য একটি পদ দেয় না, এটি আপনাকে একটি ওভারলোডেড জিনিস দেয় যা ভেরিয়েবলটি দৃশ্যমান যে কোনও সুযোগে ভেরিয়েবলের সঠিক প্রতিনিধিত্ব করে। এটি হ'ল, আমি টাইপ অনুসারে বিভিন্ন স্কোপগুলি পৃথক করার সমস্যায় চলেছি, হ্যাস্কেল টাইপচেকারকে অনুবাদ করার জন্য ডি ব্রুইজন উপস্থাপনার জন্য প্রয়োজনীয় স্থানান্তর গণনা করার জন্য পর্যাপ্ত তথ্য দেয়। কেন একটি কুকুর রাখি এবং নিজেকে ছাল?