sitelogo
ループ(loops)
MINERVA superseeded IF/Prolog. Please see http://www.ifcomputer.co.jp/MINERVA for details.

We discontinued to sell IF/Prolog Dec 31. 2003. For current customers, we continue to provide professional support for IF/Prolog until Dec 31, 2008.

IF/Prologにおいてル−プを作るには2通りの方法があります。再帰的にプログラムを作るか、あるいはル−プ機構としてバックトラックを使う方法です。

述語member/2は、再帰プログラムの良い例です。memberは第1引数である項が、第2引数であるリストの要素であるかどうかを調べます。リストが2つの部分、すなわち先頭の部分とそれ自体もリストである末尾の部分から構成されているので、適当なル−プ機構が再帰であることは明らかです。

member( X, [X|_]). member( X, [_|Y]) :- member( X, Y).

各"ル−プ"や再帰的な呼び出しでは、最初にXがリストの先頭の要素であるかどうかを調べます。そうである場合には、memberは成功します。そうでない場合には、末尾のみを第2引数として再帰的な呼び出しを行います。

もう1つのル−プ機構は、バックトラッキングによるものです。

バックトラック可能な組み込み述語には、たとえばfor/3やrepeat/0などがあります(例えばclause/2のように繰り返し成功する述語もあります)。これらは、ル−プの先頭になります。ル−プの本体は、常に失敗するか、あるいはインタプリタをル−プの頭まで戻らせるために失敗するような節によって設定されます。

例えば、述語passwdは、ユ−ザの答えが正しいパスワ−ドである場合にのみ成功します。インタプリタは、想定している語'interface_computer'が打ち込まれるまで、repeatとreadの間をル−プします。

?- [user]. |passwd:- repeat, write('\nenter password: '), read(interface_computer). |end_of_file.

yes ?- passwd. enter password: syzygy. enter password: pooh_bear. enter password: interface_computer. yes ?- _


Up read on...
scroll to top managed with ubiCMS