web-dev-qa-db-ja.com

完全性チェックに欠けているHaskellとは何ですか?

完全な(関数型)言語とは、すべてが終了するように表示できる言語です。明らかに、私がこれを望まない場所がたくさんあります-例外を投げることは時々便利です、ウェブサーバーは終了するはずではないなどです。しかし、時々、特定の最適化を有効にするためにローカル全体チェックをしたいです。たとえば、証明可能な合計関数がある場合

_commutativity :: forall (n :: Nat) (m :: Nat). n + m :~: m + n
commutativity = ...
_

次に _:~:_には1人の住民(Refl があるため、GHCは最適化できます

_gcastWith (commutativity @n @m) someExpression
  ==>
someExpression
_

そして、可換性の私の証明は、O(n)ランタイムコストがあることから無料になることです。だから、今私の質問のために:

Haskellの全体チェッカーを作成する上での微妙な困難は何ですか?

明らかに、そのようなチェッカーは保守的であるため、GHCが何かが全体であるかどうかを確認するとき(またはチェックするのが面倒なとき)は、それがそうではないと想定することができます。 stillとなるとてもスマートなチェッカーは非常に便利です(少なくとも、すべての算術証明を排除するのは簡単です)。それでも、GHCにそのようなものを組み込むための取り組みを見つけることができていないように見えるので、明らかにかなり大きな制約を見逃しています。さあどうぞ、私の夢を打ち砕いてください。 :)


関連するが最近ではない: Unfailing Haskellby Neil Mitchell、2005

34
Alec

Liquid Haskell 完全性チェックがあります: https://github.com/ucsd-progsys/liquidhaskell#termination-check

Screenshot from homepage

デフォルトでは、すべての再帰関数で終了チェックが実行されます。

No-terminationオプションを使用してチェックを無効にします

液体-非終端テスト.hs

再帰関数では、最初の代数または整数の引数は減少するはずです。

リストのデフォルトの減少メジャーは長さで、その値は整数です。

(スクリーンショットと後世のための引用を含めました。)

Agdaまたは全体チェックを行う他の言語と同様に、関数への引数は、基本ケースに到達するために、時間とともに構造的に小さくなる必要があります。全体チェッカーと組み合わせることで、これは多くの機能を確実にチェックします。 LHは、不透明またはFFIからの抽象データ型を使用して、状況がどのように減少するかを示すことにより、チェッカーを支援することもサポートします。これは非常に実用的です。

18