回答:
主な違いは、基礎となる理論と、それらの使用方法の2つの次元に沿っています。後者に焦点を当てましょう。
ユーザーとして、通常、LiquidHaskellおよびリファインメントタイプシステムの仕様の「ロジック」は決定可能なフラグメントに制限されているため、検証(および推論)は完全に自動化されます。依存する設定。これにより、大幅な自動化が実現します。たとえば、LHの挿入ソートを比較します。
http://ucsd-progsys.github.io/lh-workshop/04-case-study-insertsort.html#/ordered-lists
vs.イドリス
https://github.com/davidfstr/idris-insertion-sort/blob/master/InsertionSort.idr
ただし、自動化には代償が伴います。完全に依存する世界でできるように、仕様として任意の関数を使用することはできません。これにより、書き込むことができるプロパティのクラスが制限されます。
したがって、改良システムの目標の1つは、指定できるクラスを拡張することですが、完全に依存するシステムの目標は、 証明できるものを自動化することです。おそらく、両方の世界の最高を得ることができる幸せな出会いの場があるでしょう!
絞り込みタイプは、述語を持つ単純な通常のタイプです。つまり、が通常のタイプであり、が述語である場合
私の知る限り、Liquid Haskellでは、いくつかの依存関数タイプ、つまりタイプ [1] も許可しています。完全に依存する型(シグマ型など)は許可されないことに注意してください。
[1]で説明されている液体タイプシステムは確かに決定可能であり、液体HaskellはSMTソルバーを使用します。ただし、Liquid Haskellには証明用語(または非依存型言語で呼び出される値)も必要です。LiquidHaskellプログラムを作成するために座っている場合は、型だけでなく独自の関数を作成します。
依存型は、何らかの方法で値に依存する型です。典型的な例は、「長さのベクトルのタイプn
」n
です。ここで、は値です。質問で述べたように、絞り込みタイプは、特定の述語を満たす特定のタイプのすべての値で構成されます。例えば、正数のタイプ。これらの概念は特に関連しているわけではありません(私が知っていることです)。もちろん、「より大きなすべての数のタイプ」など、依存する絞り込みタイプを合理的に持つこともできますn
。
0
か?