Chapter 11. ATS/LF を使った定理証明

Table of Contents
データ命題 (dataprop) として関係をエンコードする
全域関数を使って証明を組み立てる
例: 乗法の分配法則
例: 乗法の交換法則
代数的なデータ種 (datasort)
例: ブラウンツリーの性質を確立する
プログラマ中心の定理証明

ATS プログラミング言語システムには、(対話的な) 定理証明をサポートする ATS/LF という名前の部品あります。 ATS/LF では、全域関数のプログラムとして証明をコンストラクトすることで定理証明は行なわれます。 この定理証明のスタイルは、関数型プログラミングと組み合わさってあるプログラミングパラダイムを産み出すことがすぐに明確になるでしょう。 このようなパラダイムを ATS では 定理証明を使ったプログラミング と呼んでいます。 その上、ATS/LF は様々な演繹システムとそれらのメタな性質をエンコードすることができます。

この章で解説するコードとテストのための追加コードは オンライン から入手できます。

データ命題 (dataprop) として関係をエンコードする

ATS の静的な部分には、証明の型を表わす静的な項のためのビルトインの種 prop があります。 種 prop の静的な項は、型もしくはより正確に命題型や、単に命題と呼ばれます。 データ命題はデータ型の宣言とよく似た作法で宣言できます。 例えば、FIB をコンストラクトする証明は次のデータ命題宣言で導入できます:

dataprop FIB(int, int) = | FIB0(0, 0) of () // [of ()] can be dropped | FIB1(1, 1) of () // [of ()] can be dropped | {n:nat}{r0,r1:int} FIB2(n+2, r0+r1) of (FIB(n, r0), FIB(n+1, r1)) // end of [FIB]

FIB に割り当てられた種は (int, int) -> prop で、FIB が2つの静的な整数を取って命題型を作ることを示しています。 FIB に関連して3つのデータ (もしくは命題の) コンストラクタがあります。 それらは FIB0, FIB1, FIB2 で、次の関数型 (もしくはより正確に命題型) が割り当てられています:

自然数 n と整数 r が与えられた時、FIB(n, r) が関係 fib(n) = r をエンコードしていることは明確でしょう。 この fib は次の3つの等式で定義されます:

命題 FIB(n, r) の証明値は、fib(n) が r と等しい場合のみコンストラクトできます。 例えば、証明の値 FIB2(FIB0(), FIB1()) には命題 FIB(2, 1) が割り当てられ、 これは fib(2) が 1 に等しいことを証明しています。

データ命題の別の例として、次の宣言は命題コンストラクタ MUL と関連する3つの証明コンストラクタを導入しています:

dataprop MUL(int, int, int) = | {n:int} MULbas(0, n, 0) of () | {m:nat}{n:int}{p:int} MULind(m+1, n, p+n) of MUL(m, n, p) | {m:pos}{n:int}{p:int} MULneg(~(m), n, ~(p)) of MUL(m, n, p) // end of [MUL]

3つの整数 m, n, p が与えられた時、証明 MUL(m, n, p) は関係 m*n = p をエンコードしています。 MULbas, MULind, MULneg はそれぞれ次の3つの等式に相当します:

言い換えると、データ命題宣言 MUL は整数の乗法関数を表わす関係をエンコードしています。

関数的な関係 (例: 関数を表わす関係) をデータ命題にエンコードする過程は Prolog のような論理型プログラミング言語における関数の実装に類似していることにすぐに気が付くでしょう。