§3   規則

 もう一つの基本概念に「規則」があります。 Prolog が「論理プログラミング」言語と呼ばれる理由は、 論理的関係を「規則」として登録し、それに基づいて推論をしながら 実行することにあります。

 規則の例として、引き算を定義しましょう。 定義は簡単です。 「b + c = aa - b = c」です。 Prolog では矢印の向きを逆にして 「a - b = cb + c = a」 のようにプログラムします。

    sub(A,B,C) :- add(B,C,A).
プログラムとしては「sub(A,B,C) を実行するには add(B,C,A) を実行すればよい」 という意味になります。

 このような計算ルールを「規則」と呼び、 事実と同様に論理データベースに登録します。

 質問してみましょう。

    ?- sub([1,5],[7],X).
    X=[8]
Prolog はこの質問に上の規則を適用します。 規則の中の変数 A, B, C[1,5], [7], X が 代入され(これは次節で説明するパターン・マッチングです)、 sub([1,5],[7],X) :- add([7],X,[1,5]) と規則を解釈し、続いて質問 add([7],X,[1,5]) が実行され、 答 X=[8] が得られます。

 規則の一般形はH :- P1, P2,...,Pn. です。 プログラムとしては、「H を実行するには、 P1, P2,...,Pn を(順に)実行すればよい」という意味になります。

 次に足し算のプログラムを拡張してみましょう。 1桁の整数 3個の和を計算するプログラムは次のようになります。

    add([A],[B],[C],[X,Y]) :- 
      add([A],[B],[D,E]),
      add([E],[C],[F,Y]),
      add([D],[F],[0,X]).

 2桁、3桁の足し算プログラムもあげておきます。

    add([A,B],[C,D],[X,Y,Z]) :-
      add([B],[D],[E,Z]),
      add([E],[A],[C],[X,Y]).
    add([A,B,C],[D,E,F],[W,X,Y,Z]) :-
      add([B,C],[E,F],[G,Y,Z]),
      add([G],[A],[D],[W,X]).


follow link follow link