このページではJavaScriptを使用しています。

9-13.その他

9-13-1.概要

ここでは、インストールディレクトリの「system/pl」以下に格納されているProlog言語によって記述された述語の説明をおこないます。

標準インタプリタにはコンパイル、リンクされていますが、ユーザプログラムをコンパイルし、これらを利用するときは、このファイルを同時にコンパイルリンクしてください。

9-13-2.詳細

(1)iso_pred.pl

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/2set_prolog_flag/2 、 copy_term/2 、 sub_atom/5 、 uppercase_atom/2 、 lowercase_atom/2 、 downcase_atom/2 

(2)setof.pl

解の集合を求める述語です。


 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). 

<含まれる述語一覧>
 findall/3 、 setof/3 、 bagof/3 、 setof/4  、s_qsort/3
※ findall/3 、 setof/3 、 bagof/3 はISO述語です
(3)utility.pl

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
 read_line/4 、 atom_appends/2 、 local_time/1 、 p_puts/2 、 get_chars_list/4 、 write_list/1 、 write_listnl/1 、 my_system_name/1 、 rexpl/3 、 rexpl/4 、 rexpl/5 、 rexpl/6 、 pattern_compile/2 、 rexpl_search/6 

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"

第1引数:対象文字列リスト

文字列リスト <例> "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)" と等価(変数が含まれるときは要注意)

第2引数:正規表現検索パターン

後述のパターン記述子と任意の文字列からなるパターンの文字列リスト、またはアトム。
アトムと数値からなるリストでこれらを結合したものがパターンとなる変数は、述語評価時までに値が決定されている必要がある①と区別するために、関数子 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 たとえば、¥[ は [ 、 ¥- は -、¥¥ は ¥とマッチする