AZ-Prolog ユーザーズマニュアル

## 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,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 | 起動システム名を返します。Ｃ言語の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 は前５引数のみの述語です。
| ?-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)を評価した結果のＸを対象文字列とします。
    | ?-rexpl(call(Z,atom_append(abc,def,Z)),"b[a-z]{2}",Y).
    Y = "bcd"
2)is(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,'[ ]*' ] )

###### 検索正規表現に記述可能なパターン記述子

. | 任意の１文字とマッチ （ダブルバイト文字も１文字。ただし、kanji_mode(_,on)のとき）
[] | 角かっこに囲まれた文字のうちの任意の 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～ｚ、0～9のうちe～hと4を除いた文字とマッチする。 すなわち、"abcdijklmnopqrstuvwxyz012356789" のどれかとマッチ。 ＾指定のみで、メンバー指定が含まれないときは、含まれてはいけない文字だけを指定されたとみなす。
(s1|s2|...) | 文字列 s1 または s2 または ... とマッチします。 文字列には正規表現が使用できます。
(s1) | 文字列 s1 とマッチします。部分文字列として、順番にリスト化されます 文字列には正規表現が使用できます。 s1のなかにさらに(s0)があるときは結果は入れ子リストとなります。 s1のなかに｜があるとＯＲとみなされるので、必要があるときは、エスケープします。(s1¥s2) 部分パターンの指定は再帰的です。たとえば、"abc(def(ghiq) (aaa)) "はトップレベルで一要素の部分パターン、部分パターンのなかにさらに２要素の部分パターンを含みます。
^ | 行の先頭にマッチします。正規表現の最初にあるときのみ有効です。
$ | 行の末尾にマッチします。正規表現の最後にあるときのみ有効です。
繰り返し
* | 直前にある文字または正規表現の0回以上の繰り返しにマッチします。 たとえば、ba*cは bc、bac、baac、baaacなどにマッチします。
+ | 直前にある文字または正規表現の１回以上の繰り返しにマッチします。 たとえば、ba+c は bac、baac、およびbaaac にはマッチしますが、bc にはマッチしません。
? | 直前にある文字または正規表現の0回または１回の繰り返しにマッチ。 たとえば、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

▲