システムFの(層別バリアント)でAckermann関数をタイプすることは可能ですか?

わかりやすい例として、純粋なシステムFでAckermann関数のオープンソース実装を見つけられなかったことに驚いた。私はついにHaskellで教会のエンコーディングを使って自分自身を実装しました:

{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ImpredicativeTypes #-}

type Nat = forall a . (a -> a) -> (a -> a)

succ :: Nat -> Nat
succ n = s z -> n s (s z)

c0 :: Nat
c1 :: Nat

c0 = _s z -> z
c1 = succ c0


exp :: Nat -> Nat -> Nat
exp = n m -> n m

tetr :: Nat -> Nat -> Nat
tetr k n = n @Nat (x -> x k) c1

iter :: (Nat -> Nat) -> (Nat -> Nat)
iter f n = (n @Nat) f c1

ack :: Nat -> Nat -> Nat
ack = m -> (m @(Nat -> Nat)) iter succ

あなたは途中でテトレーションの亜種に気付くことができます。

アッカーマンの機能(およびテトレーション)は、叙述的なシステムにおいて誘導型のない純粋なラムダ用語として定義できますか?

例えば、レベル多型を持つAgdaでは?

そうでない場合、誘導型以外の他の型理論ツールは、非プリミティブ – 再帰関数を定義するのに役立ちますか?

ベストアンサー
申し訳ありませんが、適切な答えはありません

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です