§2   事実と質問

 電卓を用いて、`153+468=' と入力すると、答が `621' と返ってきます。 これはなぜでしょうか。 電卓の中にプログラムが組み込まれてあり、 四則演算がすぐに計算できるように設計されているからです。 入学したばかりの小学生はどうでしょうか。 153+468 の計算ができるまでにはいろいろなことを学習し、 ようやくこの計算ができるようになります。 掛け算となると九九を暗記することが出発点です。

 Prolog によるプログラミングも同様な過程をたどります。 まず最初に「事実」をコンピューターに学習させます。 正確には「事実」を Prolog の論理データベースに登録することになります。 以下のプログラム例では、整数を表すのにリストを用いることにします。 例えば、1234 は [1,2,3,4] と表すことにします。

    add([0],[0],[0,0]). 
    add([0],[1],[0,1]). 
          ・・・
    add([9],[8],[1,7]). 
    add([9],[9],[1,8]). 
これで 1桁の整数と1桁の整数の足し算を 100個の「事実」として登録できました。 整数の先頭が 0 ではじまるのは変ですが、そこは目をつぶってください。

 それでは 7+8 を計算してみましょう。 Prolog ではプログラムの「実行」に相当するのが「質問」です。

    ?- add([7],[8],X).
    X=[1,5]
1行目が質問です。質問は `?-' ではじまります。 大文字の X は変数です。 Prolog はこの質問 7 + 8 = x に対して、論理データベースを検索し、 変数 x に 15 を代入すればよいと判断し、答を出します(2行目)。

 面白いことに、次のような質問 7 + x = 15 もできます。

    ?- add([7],X,[1,5]).
    X=[8]
質問に対してデータベース検索を行って答を出しているわけですから 当然のことといえますが、他のプログラミング言語にはできないことです。

 x + y = 2 のような質問に対しては、複数の解を得ることができます。

    ?- add(X,Y,[0,2]).
    X=[0]
    Y=[2] ;
    X=[1]
    Y=[1] ;
    X=[2]
    Y=[0] ;
    no
x = 0, y = 2 が表示された後に `;'(セミコロン)とリターンを 入力することで、他の解を表示させることができます。複数の解を得ることも 他の言語にはない Prolog の特色です。

 また、次のような質問もできます。

    ?- add(X,X,[1,6]).
    X=[8]
質問文中に変数が 2度現れていますが、同じ記号なので、x + x = 16 という 意味になります。

 add(X,Y,Z) のように事実や質問に用いるプログラムの基本単位を「述語」と呼びます。 これは論理学でいう述語と同じもので、変数に具体的な値を代入することで 真偽が定まる基本単位です。 add([7],[8],[1,5]) は真、add([7],[8],[1,3]) は偽、のように真偽が定まります。

 論理データベース(公理系といってもいいでしょう)に登録するのは真である事実です。 質問 ?- add([7],[8],X) に対する Prolog の処理は、 「add([7],[8],X) が真となるような X を求めよ」ということです。

 add は述語ですから真か偽かを問い合わせることもできます。

    ?- add([3],[8],[1,1]).
    yes
    ?- add([5],[8],[1,1]).
    no

 学習していない内容にたいしては、Prolog は no という答を返します。 例えば、

    ?- add([7,0],[1,2],X).
    no
となります。

 掛け算の九九を事実として Prolog に登録する方法は足し算と同様で、

    mul([0],[0],[0,0]).
    mul([0],[1],[0,0]).
          ・・・
    mul([9],[8],[7,2]).
    mul([9],[9],[8,1]).
の 100行のプログラムになります。


follow link follow link