p(0,X,X). |
p(s(X),Y,s(Z)) :- p(X,Y,Z). |
/home08/masuhara/local/bin/swiprolog
と入力します。
?-
と表示されたらconsult('test.pl').
と入力します。test.plの内容が読み込まれます。
?-
と表示されたらp(s(s(0)),s(s(s(0))),X).
のように入力すると、2+3の結果Xを求めて表示します。
;
をタイプすると、さらに別の答を探します。これ以上答がなくなった場合にはNo
と表示されます。
ux104$ /home08/masuhara/local/bin/swipl |
Welcome to SWI-Prolog (Multi-threaded, Version 5.4.5) |
Copyright (c) 1990-2003 University of Amsterdam. |
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, |
and you are welcome to redistribute it under certain conditions. |
Please visit http://www.swi-prolog.org for details. |
|
For help, use ?- help(Topic). or ?- apropos(Word). |
|
1 ?- consult('test.pl'). |
Warning: (/home08/masuhara/test.pl:11): |
Singleton variables: [X] |
% test.pl compiled 0.00 sec, 1,196 bytes |
|
Yes |
2 ?- p(s(s(0)),s(s(s(0))),X). |
|
X = s(s(s(s(s(0))))) |
より詳しい情報は以下のようなページから入手できるかも知れない:
プログラムの例
bird(woodstock). | Woodstockは鳥だ。 |
cantfly(X):-penguin(X). | ペンギンは飛べない。 |
landbird(X):-bird(X),cantfly(X). | 鳥なのに飛べないのは「飛べない鳥」だ。 |
bird(X):-penguin(X). | ペンギンは鳥だ。 |
penguin(pingu). | ピングーはペンギンだ。 |
landbird(X).
と質問すればよい。
考えてみよう
p(X,Y,Z)
をX+Y=Zを表わす述語だとする。(定義は上に示した通り)
m(X,Y,Z)
をX*Y=Zを表わす述語だとして定義してみよう。
lt(X,Y)
をX<Yを表わす述語だとして定義してみよう。(ヒント 0<N+1 は常に成立)
sqrt(X,Y)
を「YはXの平方根」だとして定義してみよう。(注意 Y は X より小さい、という条件を入れないと止まらない場合が出てくる。)
divisible(X)
を「Xは合成数(つまり非素数)」だとして定義してみよう。(ヒント Zが与えられたとき m(X,Y,Z)
は X*Y=Z を満たす X, Y を探す。ただし m(s(0),Z,Z) や m(Z,s(0),Z) は常に成り立ってしまうので注意。)