এই জিএইচসি কোর "প্রুফ" কীভাবে পড়বেন?


84

জিএইচসি কীভাবে প্রাকৃতিক সংখ্যার জন্য প্রমাণ করে যে আপনি কেবল তার চেয়ে আরও অর্ধেক অর্ধেক করতে পারেন তা নির্ধারণ করতে আমি এই ছোট্ট হাস্কেলের কথা লিখেছিলাম:

{-# LANGUAGE DataKinds, GADTs, KindSignatures, TypeFamilies #-}
module Nat where

data Nat = Z | S Nat

data Parity = Even | Odd

type family Flip (x :: Parity) :: Parity where
  Flip Even = Odd
  Flip Odd  = Even

data ParNat :: Parity -> * where
  PZ :: ParNat Even
  PS :: (x ~ Flip y, y ~ Flip x) => ParNat x -> ParNat (Flip x)

halve :: ParNat Even -> Nat
halve PZ     = Z
halve (PS a) = helper a
  where helper :: ParNat Odd -> Nat
        helper (PS b) = S (halve b)

মূল সম্পর্কিত অংশ হয়ে যায়:

Nat.$WPZ :: Nat.ParNat 'Nat.Even
Nat.$WPZ = Nat.PZ @ 'Nat.Even @~ <'Nat.Even>_N

Nat.$WPS
  :: forall (x_apH :: Nat.Parity) (y_apI :: Nat.Parity).
     (x_apH ~ Nat.Flip y_apI, y_apI ~ Nat.Flip x_apH) =>
     Nat.ParNat x_apH -> Nat.ParNat (Nat.Flip x_apH)
Nat.$WPS =
  \ (@ (x_apH :: Nat.Parity))
    (@ (y_apI :: Nat.Parity))
    (dt_aqR :: x_apH ~ Nat.Flip y_apI)
    (dt_aqS :: y_apI ~ Nat.Flip x_apH)
    (dt_aqT :: Nat.ParNat x_apH) ->
    case dt_aqR of _ { GHC.Types.Eq# dt_aqU ->
    case dt_aqS of _ { GHC.Types.Eq# dt_aqV ->
    Nat.PS
      @ (Nat.Flip x_apH)
      @ x_apH
      @ y_apI
      @~ <Nat.Flip x_apH>_N
      @~ dt_aqU
      @~ dt_aqV
      dt_aqT
    }
    }

Rec {
Nat.halve :: Nat.ParNat 'Nat.Even -> Nat.Nat
Nat.halve =
  \ (ds_dJB :: Nat.ParNat 'Nat.Even) ->
    case ds_dJB of _ {
      Nat.PZ dt_dKD -> Nat.Z;
      Nat.PS @ x_aIX @ y_aIY dt_dK6 dt1_dK7 dt2_dK8 a_apK ->
        case a_apK
             `cast` ((Nat.ParNat
                        (dt1_dK7
                         ; (Nat.Flip (dt2_dK8 ; Sym dt_dK6))_N
                         ; Nat.TFCo:R:Flip[0]))_R
                     :: Nat.ParNat x_aIX ~# Nat.ParNat 'Nat.Odd)
        of _
        { Nat.PS @ x1_aJ4 @ y1_aJ5 dt3_dKa dt4_dKb dt5_dKc b_apM ->
        Nat.S
          (Nat.halve
             (b_apM
              `cast` ((Nat.ParNat
                         (dt4_dKb
                          ; (Nat.Flip
                               (dt5_dKc
                                ; Sym dt3_dKa
                                ; Sym Nat.TFCo:R:Flip[0]
                                ; (Nat.Flip (dt_dK6 ; Sym dt2_dK8))_N
                                ; Sym dt1_dK7))_N
                          ; Sym dt_dK6))_R
                      :: Nat.ParNat x1_aJ4 ~# Nat.ParNat 'Nat.Even)))
        }
    }
end Rec }

আমি ফ্লিপ টাইপের পরিবারের উদাহরণগুলির মাধ্যমে ধরণের কাস্টিংয়ের সাধারণ প্রবাহ জানি, তবে কিছু জিনিস রয়েছে যা আমি পুরোপুরি অনুসরণ করতে পারি না:

  • এর অর্থ কী @~ <Nat.Flip x_apH>_N? এটি এক্স এর জন্য ফ্লিপ উদাহরণ? কীভাবে এর থেকে আলাদা হয় @ (Nat.Flip x_apH)? আমি < >এবং উভয়ই আগ্রহী_N

প্রথম কাস্টিং সম্পর্কে halve:

  • কি dt_dK6, dt1_dK7এবং dt2_dK8দাঁড়ানো? আমি বুঝতে পারি তারা একরকম সমতা প্রমাণ, কিন্তু কোনটি?
  • আমি বুঝতে পেরেছি যে Symসামনের দিকে পিছনে চলেছে
  • কি করবে ;? সমতুল্য প্রমাণগুলি কি কেবল ধারাবাহিকভাবে প্রয়োগ করা হয়?
  • এগুলি _Nএবং _Rপ্রত্যয়গুলি কী কী ?
  • হয় TFCo:R:Flip[0]এবং TFCo:R:Flip[1]ফ্লিপ দৃষ্টান্ত?

6
আমার কোনও ধারণা নেই তবে আমার অনুমান যে _ এন এবং _ আর নামমাত্র এবং প্রতিনিধিত্বমূলক ভূমিকা: haskell.org/ghc/docs/latest/html/users_guide/…
চি

পরিদর্শন stackoverflow.com/questions/6121146/reading-ghc-core আশা আপনি একটি ধারণা পেতে ..
হেমন্ত Ramphul

উত্তর:


6

@~ জবরদস্তি প্রয়োগ।

কোণ বন্ধনীগুলি আন্ডারকর্ডেড অক্ষর দ্বারা প্রদত্ত ভূমিকার সাথে তাদের ধারণিত ধরণের একটি প্রতিচ্ছবি জোর করে বোঝায়।

এভাবে <Nat.Flip x_ap0H>_Nএকটি সমতা প্রমাণ যে Nat.Flip x_apHসমান Nat.Flip x_apHনামমাত্র (সমান ধরনের না শুধু সমান উপস্থাপনা হিসাবে)।

পিএসে প্রচুর যুক্তি রয়েছে। আমরা স্মার্ট কনস্ট্রাক্টরটির দিকে তাকাই $WPSএবং আমরা দেখতে পাই প্রথম দুটি যথাক্রমে x এবং y এর প্রকার। আমাদের কাছে প্রমাণ রয়েছে যে কনস্ট্রাক্টর আর্গুমেন্ট Flip x(এই ক্ষেত্রে আমাদের রয়েছে have Flip x ~ Evenতারপরে আমাদের কাছে প্রমাণ রয়েছে x ~ Flip yএবং y ~ Flip xচূড়ান্ত যুক্তিটির মান ParNat x

আমি এখন টাইপের প্রথম কাস্ট দিয়ে যাব Nat.ParNat x_aIX ~# Nat.ParNat 'Nat.Odd

আমরা দিয়ে শুরু (Nat.ParNat ...)_R। এটি একটি টাইপ কনস্ট্রাক্টর অ্যাপ্লিকেশন। এটা তোলে প্রমাণ ওপরও x_aIX ~# 'Nat.Oddকরতে Nat.ParNat x_aIX ~# Nat.ParNat 'Nat.Odd। এর Rঅর্থ এটি উপস্থাপিতভাবে বোঝায় যে প্রকারগুলি isomorphic তবে একই নয় (এক্ষেত্রে সেগুলি একই তবে কাস্ট করার জন্য আমাদের সেই জ্ঞানের প্রয়োজন নেই)।

এখন আমরা প্রমাণের প্রধান বডিটি দেখি (dt1_dK7 ; (Nat.Flip (dt2_dK8 ; Sym dt_dK6))_N; Nat.TFCo:R:Flip[0]);ট্রানজিটিভিটি অর্থাত্ এই প্রমাণগুলি যথাযথভাবে প্রয়োগ করুন।

dt1_dK7এর একটি প্রমাণ x_aIX ~# Nat.Flip y_aIY

আমরা যদি তাকান (dt2_dK8 ; Sym dt_dK6)dt2_dK8শো y_aIY ~# Nat.Flip x_aIXdt_dK6টাইপ হয় 'Nat.Even ~# Nat.Flip x_aIX। তাই Sym dt_dK6টাইপ Nat.Flip x_aIX ~# 'Nat.Evenএবং (dt2_dK8 ; Sym dt_dK6)টাইপ হয়y_aIY ~# 'Nat.Even

সুতরাং (Nat.Flip (dt2_dK8 ; Sym dt_dK6))_Nএটি একটি প্রমাণ Nat.Flip y_aIY ~# Nat.Flip 'Nat.Even

Nat.TFCo:R:Flip[0]এটি হ'ল ফ্লিপের প্রথম নিয়ম Nat.Flip 'Nat.Even ~# 'Nat.Odd'

এগুলি একসাথে রাখলে আমাদের (dt1_dK7 ; (Nat.Flip (dt2_dK8 ; Sym dt_dK6))_N; Nat.TFCo:R:Flip[0])টাইপ হয় x_aIX #~ 'Nat.Odd

দ্বিতীয় আরও জটিল castালাই কাজ করা কিছুটা শক্ত তবে একই নীতিতে কাজ করা উচিত।


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