So
タイプの目的は何ですか? Agdaに翻字:それでは、何がポイントですか?
data So : Bool → Set where
oh : So true
So
は論理1までのブール提案を持ち上げます。 OuryとSwierstraの入門書The Power of Piは、テーブルの列によってインデックス付けされた関係代数の例を示しています。私は私が私のプログラムについて証明したいもののために証拠の用語を構築するために使用しています
Schema = List (String × U) -- U is the universe of SQL types
-- false iff the schemas share any column names
disjoint : Schema -> Schema -> Bool
disjoint = ...
data RA : Schema → Set where
-- ...
Product : ∀ {s s'} → {So (disjoint s s')} → RA s → RA s' → RA (append s s')
:二つのテーブルの積を取ることは、彼らはSo
を使用しているために異なる列を、持っていることが必要です。 disjointednessを確保するためにSchema
の上に論理関係を構築するために、より自然なようだ:
Disjoint : Rel Schema _
Disjoint s s' = All (λ x -> x ∉ cols s) (cols s')
where cols = map proj₁
So
「適切な」証拠期に比べて重大な欠点を持っているようだ:oh
にパターンマッチングはあなたにどんな情報を与えるものではありませんあなたは別の言葉の型チェックをすることができますか?それはSo
の値が対話的証明に有用に参加できないことを意味します。これをDisjoint
の計算上の有用性と比較してください。これはs'
の各列がs
に表示されないという証明のリストとして表されています。
私は本当に仕様So (disjoint s s')
がDisjoint s s'
よりも書き込みが簡単であることを信じていません - あなたは、型チェッカからの助けなしブールdisjoint
関数を定義する必要があります - あなたが操作したいときどのような場合にDisjoint
は、自身のために支払いますそこに含まれる証拠。
またを構築するときには、So
が努力を節約するとも懐疑的です。 So (disjoint s s')
という値を与えるためには、実際には別の型チェッカーを満足させるには、まだ十分なパターンマッチングをs
とs'
で行う必要があります。このように生成された証拠を捨てるのは無駄だと思われる。
So
は、配備されたコードの作成者とユーザーの両方にとって扱いにくいようです。 「だから」、どのような状況でSo
を使いたいですか?
また、 "だからB" のあらゆる証拠があるpropositionally他のものと等しい。これは、どのようなプロパティーbがエンコーディングしていても、実際の「証拠」の場合と必ずしも一致しない。時にはそれが欲しい。 – Saizan
@サイザン、良い点。このプロパティは、私の答えの2番目のリンクでも利用されています。良いユースケースがありますか? – user3237465
ここでは、「データ」と誘導的に定義された型と関数に再帰的に定義された型の関係について深いところがあります。 Agdaがあなたの定義で「So」の価値を推論するのはなぜうれしいのですか? –