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

9-12.その他

9-12-1.概要

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

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

9-12-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/2、set_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,aho,1.2],L).
X      = X,
L      = a(1)3aho1.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 たとえば、¥[ は [ 、 ¥- は -、¥¥ は ¥とマッチする

(4)manual.pl

<含まれる述語一覧> manual/0、manual/1