AZ-Prolog ユーザーズマニュアル
ここでは、インストールディレクトリの「system/pl」以下に格納されているProlog言語によって記述された述語の説明をおこないます。
標準インタプリタにはコンパイル、リンクされていますが、ユーザプログラムをコンパイルし、これらを利用するときは、このファイルを同時にコンパイルリンクしてください。
Prologによって記述された、ISO組込述語です。
個々の述語の詳細は、述語リファレンスに解説されています。
<含まれる述語一覧>
abolish/1 、 once/1 、 atom_concat/3 、 atom_codes/2 、 atom_chars/2 、 number_chars/2 、 char_code/2 、 get_char/1 、 get_char/2 、 open/3 、 current_predicate/1 、 current_prolog_flag/2、set_prolog_flag/2 、 copy_term/2 、 sub_atom/5 、 uppercase_atom/2 、 lowercase_atom/2 、 downcase_atom/2
解の集合を求める述語です。
findall/3 | 求めた解の集合を返します。 |
setof/3 | 求めた解の集合をソートして返します。 |
bagof/3 | 解が求まった順にかえします。 |
setof/4 | 第4引数で setof/3 のソート順(昇順、降順)を指定できます。 setof/3 の定義は次となっています。 setof(X,G,L):-setof(X,G,L,asc). |
第1引数:(+)var(解の集合を取りたい変数) 第2引数:+goal(解を発生するゴール) 第3引数:-var(ゴールの全ての解のリスト) 第4引数:+atom asc (昇順)またはdec(降順) |
<例>5クイーンの解を求める述語をqueen(5,X)とすると、その全解を求めて表示させるには以下のようにします。
| ?-queen(5,X),write(X),nl,fail. [2,4,1,3,5] [3,1,4,2,5] [1,3,5,2,4] [2,5,3,1,4] ・ ・ ・ no
この全解を、1つのリストの中に入れるにはbagof/3を用いて、
| ?-bagof(X,queen(5,X),L). X = X, L = [[2,4,1,3,5],[3,1,4,2,5],[1,3,5,2,4]・・・]
<例>集合を求めたい解が複数ある場合には、次のようにします。
| ?-setof((X,Y),append(X, Y,[ a,b,c]),L). L= [([],[a,b,c]),([a],[b,c]),・・・・・・]
自由変数(第一引数に指定されていない変数)は自由変数ごとに解の一覧を出力します。
| a(a,1). | a(a,2). | a(b,3). | a(b,4). | ?-bagof(Y,a(X,Y),L). Y = Y, X = a, L = [1,2]; Y = Y, X = b, L = [3,4]; no
自由変数を無視して解をとるには第二引数のゴールに該当変数を "^"で繋げます。
| ?-bagof(Y,X^a(X,Y),L). Y = Y, X = X, L = [1,2,3,4]; no
自由変数が複数あるときは、次のようにしてください。
| ?-bagof(X,(A,B,C)^a(X,A,B,C),L).
Prologで定義された各種ユーティリティ述語です。
atom_appends/2 | 第一引数のリストの全要素を結合したアトムを返します。 リストの要素は全ての項が可能です。 | ?-atom_appends([a(1),3,sushi,1.2],L). X = X, L = a(1)3sushi1.20000000000000 |
local_time/1 | 現在の年、月、曜日、日、時、分、秒、ミリ秒を返します。
| ?-local_time(X). X = [2007,2,3,21,11,8,19,625] |
p_puts/2 | 第一引数のストリームに第二引数の文字列をputします。
| ?-p_puts(con,"abc"). abc |
get_chars_list/4 | 指定入力ストリームから指定区切り文字までの文字列を返します。 第1引数:+入力ストリーム 第2引数:+区切り文字コード 第3引数:-ファイルが終了した場合は end継続行があるときはcontを返す 第4引数:-指定区切り文字までの文字列リスト | ?-see('queen.pl',S),repeat,get_chars_list(S,31,X,L). S = fp_b8e568, X = cont, L = [47,42,32,32,32,81,85,69,69,78,46,80,76,32,32,32,42,47]; S = fp_b8e568, X = cont, L = [58,45,32,109,111,100,117,108,47,102,97,115,116,46]; : S = fp_b8e568, X = end, L = [] yes |
write_list/1 | リストの要素を標準出力します。| ?-write_list([a,1,b(c),[1,2]]). a1b(c)[1,2] |
write_listnl/1 | 上記の最後に改行を出力します。 |
my_system_name/1 | 起動システム名を返します。C言語のargv[0]に相当
| ?-my_system_name(X). X = prolog |
AZ-Prolog(Version5以降)にはRuby等で定評のある正規表現パッケージ「鬼車」が含まれていますが、こちらはVersion4においてPrologにより実装された正規表現検索です。
前バージョンのプログラムの互換性を保つためと、Prologによる実装ならではの機能があるために付属しておりますが、大容量、多量の文字列検索を高速におこなうには「鬼車」を利用することをお勧めします。
pattern_compile/2 | 第一引数のパターンをコンパイルし第二引数に返します。 パターンを繰り返し利用するときに最初に一回のみ使います。 |
|
rexpl_search/6 | 第一引数が検索対象文字列、コンパイルしたパターンが第2引数であるほかはrexpl/6と同じです。 | |
rexpl/3 rexpl/4 rexpl/5 rexpl/6 |
非決定性述語。バックトラックしながら、検索解をかえします。 rexpl/3 は、下記 rexpl/6 の前3引数、 rexpl/4 は前4引数、 rexpl/5 は前5引数のみの述語です。 |
|
| ?-rexpl | (String, Pattern, Get, Else, Before, Parts,). |
検索対象文字列リスト(または、atomic,Float,Term) 検索パターン(文字列List,Atom,Atomic-List) 検索された文字列リスト 検索残り文字列リスト 検索された文字列リストまでの文字列 部分検索文字列リストのリスト |
<例>
| ?-rexpl("test Port 3: 324Kbps,NM 606 next else ", "Port[ ]*3:[ ]*([0-9]+)Kbps,NM[ ]*([0-9]+)", A,B,C,[X,Y]). A = "Port 3: 324Kbps,NM 606" B = " next else " C = "test " X = "324" Y = "606"
文字列リスト | <例> "abcdefg hijke" |
アトム/数値 | <例> 'abceef adsf' 124563 123.2233 |
評価式 | 1)call(X,述語(X))のとき、述語(X)を評価した結果のXを対象文字列とします。 | ?-rexpl(call(Z,atom_append(abc,def,Z)),"b[a-z]{2}",Y). Y = "bcd"2)is(X,計算式)のとき、計算式を評価した結果のXを対象文字列とします。 | ?-rexpl(Z is 3*sin(0.5),"¥.[0-9]{5}",Y). Y = ".43827" |
その他の項 | a(bcd,e) は"a(bcd,e)" と等価(変数が含まれるときは要注意) |
① | 後述のパターン記述子と任意の文字列からなるパターンの文字列リスト、またはアトム。 |
② | アトムと数値からなるリストでこれらを結合したものがパターンとなる変数は、述語評価時までに値が決定されている必要がある①と区別するために、関数子 pattern/1の引数として与える。 <例>pattern( [ 'Port[ ]*:',3,'[ ]*' ] ) |
. | 任意の1文字とマッチ (ダブルバイト文字も1文字。ただし、kanji_mode(_,on)のとき) |
[] | 角かっこに囲まれた文字のうちの任意の 1 文字、または、ハイフン (-) で区切られた文字範囲のうちの任意の1文字にマッチ。 たとえば、b[aeiou]d は bad、bed、bid、bod、および bud にマッチ。 また、r[eo]+d は red、rod、reed、および rood にはマッチするが、reod や roed にはマッチしない。x[0-9] は x0、x1、x2 などにマッチ。 角かっこ内にカレット (^) を指定すると意味が反対になる、カレットに続く文字以外のすべての文字にマッチ。 たとえば、x[^0-9] は xa、xb、xc などにはマッチしますが、x0、x1、x2 などにはマッチしません。 ^とそれ以外は混在可能。順序は問わない。 <例>[a-z^e-h^40-9] a~z、0~9のうちe~hと4を除いた文字とマッチする。 すなわち、"abcdijklmnopqrstuvwxyz012356789" のどれかとマッチ。 ^指定のみで、メンバー指定が含まれないときは、含まれてはいけない文字だけを指定されたとみなす。 |
(s1|s2|...) | 文字列 s1 または s2 または ... とマッチします。 文字列には正規表現が使用できます。 |
(s1) | 文字列 s1 とマッチします。部分文字列として、順番にリスト化されます 文字列には正規表現が使用できます。 s1のなかにさらに(s0)があるときは結果は入れ子リストとなります。 s1のなかに|があるとORとみなされるので、必要があるときは、エスケープします。(s1¥s2) 部分パターンの指定は再帰的です。たとえば、"abc(def(ghiq) (aaa)) "はトップレベルで一要素の部分パターン、部分パターンのなかにさらに2要素の部分パターンを含みます。 |
^ | 行の先頭にマッチします。正規表現の最初にあるときのみ有効です。 |
$ | 行の末尾にマッチします。正規表現の最後にあるときのみ有効です。 |
繰り返し | |
---|---|
* | 直前にある文字または正規表現の0回以上の繰り返しにマッチします。 たとえば、ba*cは bc、bac、baac、baaacなどにマッチします。 |
+ | 直前にある文字または正規表現の1回以上の繰り返しにマッチします。 たとえば、ba+c は bac、baac、およびbaaac にはマッチしますが、bc にはマッチしません。 |
? | 直前にある文字または正規表現の0回または1回の繰り返しにマッチ。 たとえば、ba?c は bac、bc にはマッチしますが、baac にはマッチしない。 |
{数値} | 直前にある文字または正規表現の数値の回数繰り返しにマッチ。 |
エスケープ文字 ( ¥ ) | |
¥n | 改行コード(Asci 31)とマッチ |
¥t |
タブ(Asci 9)とマッチ |
¥b | バックスペース(Asci 8)とマッチ |
¥(7) | アスキーコード7とマッチする。 "(7)"とマッチさせたいときは、"¥(¥7¥)" |
¥N | N:一桁数字 (¥1...¥9) 部分パターンのN番目とマッチします。 |
¥Any |
Any たとえば、¥[ は [ 、 ¥- は -、¥¥ は ¥とマッチする |