整数の加算関数には ATS では次のような依存型を割り当てることができます。 これはこの関数が2つの整数の引数の和を返すことを示しています:
この型は整数の加算に対する完全な仕様です。この型を取るような停止する関数は、整数の加算関数だけです。 けれども、自然数 n に適用すると最初の n 個の正の整数の積を得るような、階乗関数には次のような型を与えることができません: 階乗関数を指す fact は ATS の静的な部分には存在しないからです。 明らかに、大変興味深く適切な疑問は次のようなものでしょう。 fact で明記された関数的関係を完全に捕捉するような型を ATS で作れるのでしょうか? その答は YES です。 そのような型をコンストラクトできるだけでなく、ATS で実装された停止する関数に適用することもできるのです。階乗関数は次の2つの等式で定義できることを思い出してみましょう:
当然これらの等式は、次のように宣言される dataprop FACT に関連したコンストラクタでエンコードできます:dataprop FACT(int, int) = | FACTbas(0, 1) | {n:nat}{r1,r:int} FACTind(n, r) of (FACT(n-1, r1), MUL(n, r1, r)) // end of [FACT]
// fun ifact {n:nat} .<n>. ( n: int(n) ) :<> [r:int] (FACT(n, r) | int r) = ( // if n = 0 then (FACTbas() | 1) else let val (pf1 | r1) = ifact (n-1) // pf1: FACT(n-1, r1) val (pfmul | r) = imul2 (n, r1) // pfmul: FACT(n, r1, r) in (FACTind(pf1, pfmul) | r) end // end of [else] // ) (* end of [ifact] *) //
この章で紹介したコードの全体とテストのための追加コードは オンライン から入手できます。