azlist=[]; var hash={}; hash["id"]="0"; hash["name"]="Console"; hash["common"]=""; hash["format"]=""; hash["argument"]=""; hash["text"]="CTRL-Xヒストリーの表示
テンプレート
CTRL-F現在の行にテンプレートから1文字コピーする
CTRL-A現在の行にテンプレートに残っている全ての文字をコピーする
CTRL-Eテンプレート内の1文字をスキップする
CTRL-W挿入モードに入る。もう1度押すと挿入モードを解除する
CTRL-T現在の行の内容をテンプレートにコピーする
CTRL-Q現在の行の先頭まで戻り最初の2文字をスキップする
CTRL-U現在のテンプレートより一つ古いヒストリーをテンプレートにコピーし
同時に現在行の最初からコピーする(CTRL-A)
(最初のCTRL-UはCTRL-Aと同じ)
CTRL-N現在のテンプレートより一つ新しいヒストリーをテンプレート
にコピーし同時に現在行の最初からコピーする(CTRL-A)

"; hash["reference"]=""; hash["sample"]=""; hash["genre"]=""; hash["used"]="false"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="1"; hash["name"]="consult/1"; hash["common"]=""; hash["format"]="consult(+A)"; hash["argument"]="A:ファイル名(パス指定も可)"; hash["text"]="指定されたテキストファイルからプログラムを読み込みます。
正確には、読み込んだものが節であればその節をプログラムに付け加えます。
そのときに、既に同じ述語がある場合(頭部の名前およびアリティが等しい節が既にある場合)にはその後に付け加えられます。
また、読み込んだものが「コマンド」又は「質問」の場合にはそれを実行します。
UTF-8の文字コードプログラムファイルを作成する場合、BOMを付けないでください。

型定義を読み込むと、自動的に素性構造モードが型付素性構造モードに変化します。
型付素性構造モードではプログラム中の素性構造に対して型推論を行います。"; hash["reference"]="「(操)5.3.2ファイルからのプログラム入力」
[・・・・・・]"; hash["sample"]="| ?-consult('test.pl').
yes

カレントディレクトリよりtest.plというソースファイルを読み込みます。"; hash["genre"]="1"; hash["used"]="true"; hash["incident"]="reconsult/1"; azlist.push(hash); var hash={}; hash["id"]="2"; hash["name"]="reconsult/1"; hash["common"]=""; hash["format"]="reconsult(+A)"; hash["argument"]="A:ファイル名(パス指定も可)"; hash["text"]="consult/1と同じように指定されたテキストファイルからプログラムを読み込みます。
ただし、consult/1との違いは既に同じ述語がある場合にはその述語の後に新しい節が付け加えるのではなくて、古い述語の定義は消去されて新しい述語の定義に置き換えられます。
UTF-8の文字コードプログラムファイルを作成する場合、BOMを付けないでください。

既に型定義が存在する場合には、新しいプログラムが読み込まれる前にすべて消去されます。

"; hash["reference"]="「(操)5.3.2ファイルからのプログラム入力」
[・・・・・・]"; hash["sample"]="| ?-reconsult('robot.pl').
yes

カレントディレクトリよりrobot.plというソースファイルを読み込みます。"; hash["genre"]="1"; hash["used"]="true"; hash["incident"]="consult/1"; azlist.push(hash); var hash={}; hash["id"]="3"; hash["name"]="=:= /xfx"; hash["common"]="ISO"; hash["format"]="N1 =:= N2"; hash["argument"]="N1,N2:共に数式"; hash["text"]="N1とN2の双方を評価した値が等しい場合に成功し、それ以外の場合は失敗します。"; hash["reference"]=""; hash["sample"]="| ?-1+1 =:= 2.
yes
| ?-1.0 =:= 1.
yes"; hash["genre"]="14"; hash["used"]="true"; hash["incident"]="=¥= /xfx
=/= /xfx
< /xfx
> /xfx
=< /xfx
>= /xfx"; azlist.push(hash); var hash={}; hash["id"]="4"; hash["name"]="\== /xfx"; hash["common"]="ISO"; hash["format"]="T1 ¥== T2、T1 /== T2、どちらでも同じ"; hash["argument"]="T1・T2:ストリーム値を除く項。ただし、数式は評価されない。"; hash["text"]="T1とT2がまったく同じ項の場合に成功し、それ以外の場合は失敗します。ストリングの場合はその実体は文字コードのリストですから、もう片方がその同じリストならば成功します。"; hash["reference"]=""; hash["sample"]="| ?-abc == abc.
yes
| ?-a(1,2) == a(1,2).
yes
| ?-1+2 == 1+2.
yes
| ?-1+2 == 3.
no
| ?-1+2 == 2+1.
no
| ?-"abc" == [97,98,99].
yes
"; hash["genre"]="15"; hash["used"]="true"; hash["incident"]="/== /xfx
¥== /xfx
@< /xfx
@=< /xfx
@> /xfx
@>= /xfx
compare/3"; azlist.push(hash); var hash={}; hash["id"]="5"; hash["name"]="< /xfx"; hash["common"]="ISO"; hash["format"]="N1 < N2"; hash["argument"]="N1,N2:共に数式"; hash["text"]="N1を評価した値よりN2を評価した値の方が大きい場合に成功し、それ以外の場合は失敗します。"; hash["reference"]=""; hash["sample"]="| ?-1+1 < 3.
yes
| ?-1.0 < 2.
yes"; hash["genre"]="14"; hash["used"]="true"; hash["incident"]="=:= /xfx
=\= /xfx
=/= /xfx
> /xfx
=< /xfx
>= /xfx"; azlist.push(hash); var hash={}; hash["id"]="6"; hash["name"]="> /xfx"; hash["common"]="ISO"; hash["format"]="N1 > N2"; hash["argument"]="N1,N2:共に数式"; hash["text"]="N1を評価した値よりN2を評価した値の方が小さい場合に成功し、それ以外の場合は失敗します。"; hash["reference"]=""; hash["sample"]="| ?-1+1 > 1.
yes
| ?-2.0 > 1.
yes"; hash["genre"]="14"; hash["used"]="true"; hash["incident"]="=:= /xfx
=\= /xfx
=/= /xfx
< /xfx
=< /xfx
>= /xfx"; azlist.push(hash); var hash={}; hash["id"]="7"; hash["name"]="=< /xfx"; hash["common"]="ISO"; hash["format"]="N1 =< N2"; hash["argument"]="N1,N2:共に数式"; hash["text"]="N1を評価した値よりN2を評価した値の方が大きいか等しい(以上)場合に成功し、それ以外の場合は失敗します。"; hash["reference"]=""; hash["sample"]="| ?-1+1 =< 2.
yes
| ?-1.0 =< 2.
yes"; hash["genre"]="14"; hash["used"]="true"; hash["incident"]="=:= /xfx
=\= /xfx
=/= /xfx
< /xfx
> /xfx
>= /xfx"; azlist.push(hash); var hash={}; hash["id"]="8"; hash["name"]=">= /xfx"; hash["common"]="ISO"; hash["format"]="N1 >= N2"; hash["argument"]="N1,N2:共に数式"; hash["text"]="N1を評価した値よりN2を評価した値の方が小さいか等しい(以下)場合に成功し、それ以外の場合は失敗します。"; hash["reference"]=""; hash["sample"]="| ?-2+1 >= 2.
yes
| ?-2.0 >= 1.
yes"; hash["genre"]="14"; hash["used"]="true"; hash["incident"]="=:= /xfx
=\= /xfx
=/= /xfx
< /xfx
> /xfx
=< /xfx"; azlist.push(hash); var hash={}; hash["id"]="9"; hash["name"]="== /xfx"; hash["common"]="ISO"; hash["format"]="T1 == T2"; hash["argument"]="T1・T2:ストリーム値を除く項。ただし、数式は評価されない。"; hash["text"]="T1とT2がまったく同じ項の場合に成功し、それ以外の場合は失敗します。
ストリングの場合はその実体は文字コードのリストですから、もう片方がその同じリストならば成功します。"; hash["reference"]=""; hash["sample"]="| ?-abc == abc.
yes
| ?-a(1,2) == a(1,2).
yes
| ?-1+2 == 1+2.
yes
| ?-1+2 == 3.
no
| ?-1+2 == 2+1.
no
| ?-"abc" == [97,98,99].
yes"; hash["genre"]="15"; hash["used"]="true"; hash["incident"]="/== /xfx
¥== /xfx
@< /xfx
@=< /xfx
@> /xfx
@>= /xfx
compare/3"; azlist.push(hash); var hash={}; hash["id"]="712"; hash["name"]="get_leash/1"; hash["common"]=""; hash["format"]="get_leash(-I)"; hash["argument"]="I:leash/1で設定した値がユニファイされる"; hash["text"]="leash/1で設定したコマンド受付局面を取得します。
"; hash["reference"]=""; hash["sample"]="| ?-get_leash(X).
X = 35
yes
| ?-debugging.
<< DEBUGGING >>
Debug Mode = debug
Unknown = fail
Spy Points =
Command Point = Try Match Retry
Display Point = Try Match Succ Fail Pop Retry
Verbos Mode = middle
yes
| ?-"; hash["genre"]="24"; hash["used"]="true"; hash["incident"]="debug/0
nodebug/0
trace/0
notrace/0
spy /fy
nospy /fy
leash/1
leash1/1
unknown/2
debugging/0"; azlist.push(hash); var hash={}; hash["id"]="11"; hash["name"]="@< /xfx"; hash["common"]="ISO"; hash["format"]="T1 @< T2"; hash["argument"]="T1・T2:ストリーム値を除く項。ただし、数式は評価されない。"; hash["text"]="T1よりT2が大きい場合に成功し、それ以外の場合は失敗します。
以下の仕様は ver.7 以前のものと大きく異なるので注意が必要です。

<項の比較方法>
・まず、項の種類によって大小判定します。次の規則に従います。
未代入の変数<実数値<整数値<アトム<複合項
同じ種類の項同士を比較する場合は次の規則に従います。

・未代入の変数同士の場合は変数の種類によって次の関係が有ります。
大域変数<局所変数<虚変数
同じ種類の変数は節の中で古い方が小さいと見なされます。
「古い方」とは原則として、より左側にある方を指します。ただし、未代入の変数同士がユニファイされている時などは事情が違ってくる事もあります。

・整数値同士、実数値同士の場合は数値比較と同じ結果になります。
ただし、数式の場合は評価されませんので演算子・関数子を述語名とする複合項として比較されます。

・双方がアトムの場合はまず先頭の文字同士の文字コードの大小を比べて判断します。もし等しかった場合はその次の文字同士を調べます。

・双方が複合項の場合はまずアリティ(引数の数)を調べて、アリティが多い方を大きいと判断します。もしアリティが同じだった場合は述語名のアトムを調べます。
さらに述語名も同じであれば、引数の比較に移ります。
リストはその実体であるアリティが2、述語名が「.」の複合項として扱われます。
さらにストリングもその実体である文字列のキャラクタコードのリストとして扱われます。"; hash["reference"]=""; hash["sample"]="| ?-2.1 @< 1.
yes
| ?-abc @< xyz.
yes
| ?-a(1,2) @< a(1,2).
no
| ?-aa1 @< aa2.
yes
| ?-aaa @< aaa.
no
| ?-234 @< 1234.
yes
| ?-'234' @< '1234'.
no"; hash["genre"]="15"; hash["used"]="true"; hash["incident"]="== /xfx
/== /xfx
¥== /xfx
@=< /xfx
@> /xfx
@>= /xfx
compare/3"; azlist.push(hash); var hash={}; hash["id"]="12"; hash["name"]="@=< /xfx"; hash["common"]="ISO"; hash["format"]="T1 @=< T2"; hash["argument"]="T1・T2:ストリーム値を除く項。ただし、数式は評価されない。"; hash["text"]="T1よりT2が大きいか又は等しい場合に成功し、それ以外の場合は失敗します。
項の比較方法は @< /xfx と同じです。(@< /xfx 参照)"; hash["reference"]=""; hash["sample"]="| ?-abc @=< xyz.
yes
| ?-a(1,2) @=< a(1,2).
yes
| ?-aa1 @=< aa2.
yes
| ?-aaa @=< aaa.
yes
| ?-234 @=< 1234.
yes
| ?-'234' @=< '1234'.
no
| ?-[1,2,3] @=< [3,2,1].
yes"; hash["genre"]="15"; hash["used"]="true"; hash["incident"]="== /xfx
/== /xfx
== /xfx
@< /xfx
@> /xfx
@>= /xfx
compare/3"; azlist.push(hash); var hash={}; hash["id"]="13"; hash["name"]="@> /xfx"; hash["common"]="ISO"; hash["format"]="T1 @> T2"; hash["argument"]="T1・T2:ストリーム値を除く項。ただし、数式は評価されない。"; hash["text"]="T1よりT2が小さい場合に成功し、それ以外の場合は失敗します。
項の比較方法は @< /xfx と同じです。(@< /xfx 参照)"; hash["reference"]=""; hash["sample"]="| ?-abc @> xyz.
no
| ?-a(1,2) @> a(1,2).
no
| ?-aa1 @> aa2.
no
| ?-aaa @> aaa.
no
| ?-234 @> 1234.
no
| ?-'234' @> '1234'.
yes
| ?-[1,2,3] @> [3,2,1].
no"; hash["genre"]="15"; hash["used"]="true"; hash["incident"]="== /xfx
/== /xfx
== /xfx
@< /xfx
@=< /xfx
@> /xfx
@>= /xfx
compare/3"; azlist.push(hash); var hash={}; hash["id"]="14"; hash["name"]="@>= /xfx"; hash["common"]="ISO"; hash["format"]="T1 @>= T2"; hash["argument"]="T1・T2:ストリーム値を除く項。ただし、数式は評価されない。"; hash["text"]="T1よりT2が小さいか又は等しい場合に成功し、それ以外の場合は失敗します。
項の比較方法は @< /xfx と同じです。(@< /xfx 参照)"; hash["reference"]=""; hash["sample"]="?-abc @>= xyz.
no
?-a(1,2) @>= a(1,2).
yes
?-aa1 @>= aa2.
no
?-aaa @>= aaa.
yes
?-234 @>= 1234.
no
?-'234' @>= '1234'.
yes
?-[1,2,3] @>= [3,2,1].
no"; hash["genre"]="15"; hash["used"]="true"; hash["incident"]="== /xfx
/== /xfx
== /xfx
@< /xfx
@=< /xfx
@> /xfx
compare/3"; azlist.push(hash); var hash={}; hash["id"]="15"; hash["name"]="compare/3"; hash["common"]="ISO"; hash["format"]="compare(A,T1,T2)"; hash["argument"]="
A :大小関係を表す「>」「<」「=」のどれかがユニファイされる
T1・T2 :ストリーム値を除く項。ただし、数式は評価されない
"; hash["text"]="T1とT2の大小関係を比べて、それを表す「>」「<」「=」のどれかをAにユニファイします。
項の比較方法は @< /xfx と同じです。(@< /xfx 参照)"; hash["reference"]=""; hash["sample"]="| ?-compare(A,2.1,1).
A = <
yes
| ?-compare(A,z,a).
A = >
yes
| ?-compare(A,a(1),a(1)).
A = =
yes
| ?-compare(A,[3,4],[1,2,3]).
A = >
yes
| ?-compare(A,b(1),a(1,2)).
A = <
yes"; hash["genre"]="15"; hash["used"]="true"; hash["incident"]="== /xfx
/== /xfx
\= /xfx
@< /xfx
@=< /xfx
@> /xfx
@>= /xfx"; azlist.push(hash); var hash={}; hash["id"]="16"; hash["name"]="assert/1"; hash["common"]="ISO"; hash["format"]="assert(+C)"; hash["argument"]="C:追加したい節になりうる項(数値とストリーム値以外の項)"; hash["text"]="引数に与えられた項Cを節としてヒープ(プログラム)領域に追加します。
既に同じ述語(同じ述語名とアリティの頭部を持つ節の集り)が存在していた場合にはその同じ節の何番目に追加されるかは保証されません。
通常は最後に追加されます。
節の追加は「assert/2」「asserta/1」「assertz/1」でも可能です。
Cが<節の書式>に当てはまらない場合はエラー(syntax error)になります。
※追加する節の頭部と同じ述語名とアリティを持つ「標準組込み述語」「コンパイル組込み述語」「Cリンク組込み述語」が既に存在する場合はエラー(builtin or C pred exist)になります。"; hash["reference"]="「(述)2.4プログラム構成」
「(操)9.5コンパイルコードとインタープリタコードの動作上の違い」"; hash["sample"]="| ?-listing.
a(1).
a(2).
a(3).
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
yes
| ?-assert(a(a)).
yes
| ?-assert(a(b)).
yes
| ?-assert((a(3,1) :- write(mno),nl)).
yes
| ?-assert((a(3,2) :- write(qrs),nl)).
yes
| ?-listing.
a(1).
a(2).
a(3).
a(a). <== assert/1 によって追加された節
a(b). <== assert/1 によって追加された節
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
a(3,1) :- write(mno),nl. <== assert/1 によって追加された節
a(3,2) :- write(qrs),nl. <== assert/1 によって追加された節
yes"; hash["genre"]="16"; hash["used"]="true"; hash["incident"]="assert/2
asserta/1
assertz/1"; azlist.push(hash); var hash={}; hash["id"]="17"; hash["name"]="assert/2"; hash["common"]="ISO"; hash["format"]="assert(+C,+I)"; hash["argument"]="C:追加したい節になりうる項(数値とストリーム値以外の項)
I:追加する位置(負整数も可)"; hash["text"]="引数に与えられた項Cを節としてヒープ(プログラム)領域に追加します。
既に同じ述語(同じ述語名とアリティの頭部を持つ節の集り)が存在していた場合にその同じ節の中の何番目に追加するかをIによって指定できます。
正確には現在のI番目の節とI+1番目の節の間に挿入します。
その結果、挿入された節はI+1番目の節となります。
複数の同じ述語名とアリティの頭部を持つ節の集りの途中に追加する場合に使います。
節の集りの最初か最後への追加は「asserta/1」「assertz/1」で可能です。
Cが<節の書式>に当てはまらない場合はエラー(syntax error)になります。
※追加する節の頭部と同じ述語名とアリティを持つ「標準組込み述語」「コンパイル組込み述語」「Cリンク組込み述語」が既に存在する場合はエラー(builtin or C pred exist)になります。"; hash["reference"]="「(述)2.4プログラム構成」
「(操)9.5コンパイルコードとインタープリタコードの動作上の違い」"; hash["sample"]="| ?-listing.
a(1).
a(2).
a(3).
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
yes
| ?-assert(a(a),2).
yes
| ?-assert((a(3,1) :- write(mno),nl),1).
yes
| ?-listing.
a(1).
a(2).
a(a). <== assert/2 によって追加された節
a(3).
a(1,1) :- write(abc),nl.
a(3,1) :- write(mno),nl. <== assert/2 によって追加された節
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
yes"; hash["genre"]="16"; hash["used"]="true"; hash["incident"]="assert/1
asserta/1
assertz/1"; azlist.push(hash); var hash={}; hash["id"]="18"; hash["name"]="asserta/1"; hash["common"]="ISO"; hash["format"]="asserta(+C)"; hash["argument"]="C:追加したい節になりうる項(数値とストリーム値以外の項)"; hash["text"]="引数に与えられた項Cを節としてヒープ(プログラム)領域に追加します。
既に同じ述語(同じ述語名とアリティの頭部を持つ節の集り)が存在していた場合にはその同じ節の最初(1番目)に追加されます。
Cが<節の書式>に当てはまらない場合はエラー(syntax error)になります。
※追加する節の頭部と同じ述語名とアリティを持つ「標準組込み述語」「コンパイル組込み述語」「Cリンク組込み述語」が既に存在する場合はエラー(builtin or C pred exist)になります。"; hash["reference"]="「(述)2.4プログラム構成」
「(操)9.5コンパイルコードとインタープリタコードの動作上の違い」
"; hash["sample"]="| ?-listing.
a(1).
a(2).
a(3).
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
yes
| ?-asserta(a(a)).
yes
| ?-asserta((a(3,2) :- write(qrs),nl)).
yes
| ?-listing.
a(a). <== asserta/1 によって追加された節
a(1).
a(2).
a(3).
a(3,2) :- write(qrs),nl. <== asserta/1 によって追加された節
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
yes"; hash["genre"]="16"; hash["used"]="true"; hash["incident"]="assert/1
assert/2
assertz/1"; azlist.push(hash); var hash={}; hash["id"]="19"; hash["name"]="assertz/1"; hash["common"]="ISO"; hash["format"]="assertz(+C)"; hash["argument"]="C:追加したい節になりうる項(数値とストリーム値以外の項)"; hash["text"]="引数に与えられた項Cを節としてヒープ(プログラム)領域に追加します。
既に同じ述語(同じ述語名とアリティの頭部を持つ節の集り)が存在していた場合にはその同じ節の最後に追加されます。
Cが<節の書式>に当てはまらない場合はエラー(syntax error)になります。
※追加する節の頭部と同じ述語名とアリティを持つ「標準組込み述語」「コンパイル組込み述語」「Cリンク組込み述語」が既に存在する場合はエラー(builtin or C pred exist)になります。"; hash["reference"]="「(述)2.4プログラム構成」
「(操)9.5コンパイルコードとインタープリタコードの動作上の違い」"; hash["sample"]="assert/1 の[実行例]参照"; hash["genre"]="16"; hash["used"]="true"; hash["incident"]="assert/1
assert/2
asserta/1"; azlist.push(hash); var hash={}; hash["id"]="20"; hash["name"]="abolish/1"; hash["common"]="ISO"; hash["format"]="abolish(+A/+I) abolish(+A,+I)"; hash["argument"]="A:削除する述語の述語名
I:削除する述語のアリティ"; hash["text"]="引数で指定された述語名・アリティの述語(引数で指定された述語名・アリティを頭部とする定義節)のすべてをヒープ領域から削除します。
現在の動作モードがユーザモードの場合はユーザ述語(ユーザ側の定義節)しか削除できません。
システムモードの場合はユーザ述語(ユーザ側の定義節)に加えてシステム述語(システム側の定義節)が指定できます。
どちらの場合でも「標準組込み述語」「コンパイル組込み述語」「Cリンク組込み述語」を指定した場合はエラー(builtin or C pred exist)になります。"; hash["reference"]="「(操)5.11.2定義述語(システム述語とユーザ述語)」"; hash["sample"]="| ?-listing.
a(1).
a(2).
a(3).
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
b(1).
b(2).
yes
| ?-abolish(a,1).
yes
| ?-listing.
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
b(1).
b(2).
yes
| ?-abolish(b/1).
yes
| ?-listing.
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
yes"; hash["genre"]="16"; hash["used"]="true"; hash["incident"]="retract/1
retract/3
s_new/0"; azlist.push(hash); var hash={}; hash["id"]="21"; hash["name"]="retract/1"; hash["common"]="ISO"; hash["format"]="retract(+C)"; hash["argument"]="C:削除する節の頭部とユニファイ可能な項"; hash["text"]="まず、ヒープ領域中の定義節の中からCとユニファイ可能な節をヒープ領域の先頭から探し、あればユニファイが試みられます。そしてユニファイに成功すればその節がヒープ領域中から削除されます。
Cの中に変数が含まれていても、その定義節の該当の値がユニファイされます。
この述語は非決定性ですから、その後バックトラックによって戻ってきた場合は再びCとユニファイ可能な節をヒープ領域の先頭から探し、あればユニファイが試みられます。以下同じ事を繰返します。
Cとユニファイ可能な節がヒープ領域に無かった(又は、無くなった)場合はこの述語は失敗します。
現在の動作モードがユーザモードの場合はユーザ述語(ユーザ側の定義節)しか削除できません。「システム述語」「標準組込み述語」「コンパイル組込み述語」「Cリンク組込み述語」を指定した場合はエラー(builtin or C pred exist)になります
システムモードの場合はユーザ述語(ユーザ側の定義節)に加えてシステム述語(システム側の定義節)も削除できます。この場合でも「標準組込み述語」「コンパイル組込み述語」「Cリンク組込み述語」を指定した場合はエラー(builtin or C pred exist)になります。"; hash["reference"]="「(操)5.11.2定義述語(システム述語とユーザ述語)」
「(操)9.5コンパイルコードとインタープリタコードの動作上の違い」"; hash["sample"]="| ?-listing.
a(1).
a(2).
a(3).
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
yes
| ?-retract(a(X)).
X = 1;
X = 2
yes
| ?-listing.
a(3).
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
yes
| ?-retract(a(X)).
X = 3;
no
| ?-listing.
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
yes"; hash["genre"]="16"; hash["used"]="true"; hash["incident"]="abolish/2
retract/3
s_new/0"; azlist.push(hash); var hash={}; hash["id"]="22"; hash["name"]="retract/3"; hash["common"]=""; hash["format"]="retract(+A,+I1,+I2)"; hash["argument"]="A:削除する述語の述語名
I1:削除する述語のアリティ
I2:削除する節の指定(上から第何番目か)"; hash["text"]="述語名AとアリティI1によって指定された述語の定義のI2番目の節をプログラムから取り除きます。
ただし、I2が負のときには指定された述語の定義の後ろからI2番目の節をプログラムから取り除きます。
どちらの場合にも該当する節が存在しないときには失敗します。
例外として、I2に0を指定した場合には最初の節が取り除かれます(つまり、1を指定したのと同じ)。
現在の動作モードがユーザモードの場合はユーザ述語(ユーザ側の定義節)しか削除できません。「システム述語」「標準組込み述語」「コンパイル組込み述語」「Cリンク組込み述語」を指定した場合はエラー(builtin or C pred exist)になります。
システムモードの場合はユーザ述語(ユーザ側の定義節)に加えてシステム述語(システム側の定義節)も削除できます。この場合でも「標準組込み述語」「コンパイル組込み述語」「Cリンク組込み述語」を指定した場合はエラー(builtin or C pred exist)になります。"; hash["reference"]="「(操)5.11.2定義述語(システム述語とユーザ述語)」
「(操)9.5コンパイルコードとインタープリタコードの動作上の違い」"; hash["sample"]="| ?-listing.
a(1).
a(2).
a(3).
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
yes
| ?-retract(a,1,2).
yes
| ?-listing.
a(1).
a(3).
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
yes
| ?-retract(a,2,-1).
yes
| ?-listing.
a(1).
a(3).
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
yes"; hash["genre"]="16"; hash["used"]="true"; hash["incident"]="abolish/2
retract/1
s_new/0"; azlist.push(hash); var hash={}; hash["id"]="23"; hash["name"]="s_new/0"; hash["common"]=""; hash["format"]="s_new"; hash["argument"]="なし"; hash["text"]="全ユーザ側定義節(全ユーザ述語)を一括削除します。
現在の動作モードには無関係です。
「システム述語」「標準組込み述語」「コンパイル組込み述語」「Cリンク組込み述語」は削除されません。
型付素性構造モードでは、ユーザ述語だけでなく型定義の情報もすべて消去します。"; hash["reference"]=""; hash["sample"]="| ?-listing.
a(1).
a(2).
a(3).
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
yes
| ?-s_new.
yes
| ?-listing.
yes"; hash["genre"]="16"; hash["used"]="true"; hash["incident"]="abolish/1
abolish/2
retract/1
retract/3
s_new/0"; azlist.push(hash); var hash={}; hash["id"]="24"; hash["name"]="clause/2"; hash["common"]="ISO"; hash["format"]="clause(+T1,-T2)"; hash["argument"]="T1:取り出す頭部を指定する
T2:取り出された本体がユニファイされる"; hash["text"]="T1とユニファイ可能な頭部を持つ節を見つけて、その節の本体をT2にユニファイします。
もし、その節が規則(本体を持たない節)の場合はT2に「true」をユニファイします。
ユーザ側定義節・システム側定義節を問わず取り出します。
T1の中に変数が含まれる場合は、該当の値をユニファイします。
この述語は非決定性ですから、バックトラックにより後戻りしてきた場合は、次の節を探します。
該当の節がなければこの述語は失敗します。
「標準組込み述語」「コンパイル組込み述語」「Cリンク組込み述語」は取り出せません。"; hash["reference"]="「(操)9.5コンパイルコードとインタープリタコードの動作上の違い」"; hash["sample"]="| ?-listing.
a(1).
a(2).
a(3).
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
yes
| ?-clause(a(X),C).
X = 1,
C = true;
X = 2,
C = true
yes
| ?-clause(a(1,X),C).
X = 1,
C = write(abc),nl;
X = 2,
C = write(def),nl;
no"; hash["genre"]="16"; hash["used"]="true"; hash["incident"]="clause/3
clause/4"; azlist.push(hash); var hash={}; hash["id"]="25"; hash["name"]="clause/3"; hash["common"]=""; hash["format"]="clause(+A,+I1,-I2)"; hash["argument"]="A:節の述語名
I1:節のアリティ
I2:節の個数"; hash["text"]="述語名A、アリティI1の頭部を持つ節の数をI2にユニファイします。
ユーザ側定義節・システム側定義節を問わず取り出します。
該当の節がない場合はI2に 0 をユニファイします。
「標準組込み述語」「コンパイル組込み述語」「Cリンク組込み述語」を指定した場合もI2に0をユニファイします。"; hash["reference"]=""; hash["sample"]="?-listing.
a(1).
a(2).
a(3).
a(4).
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
yes
?-clause(a,1,X).
X = 4
yes
?-clause(a,2,X).
X = 3
yes
?-clause(write,1,X).
X = 0
yes"; hash["genre"]="16"; hash["used"]="true"; hash["incident"]="clause/2
clause/4"; azlist.push(hash); var hash={}; hash["id"]="26"; hash["name"]="clause/4"; hash["common"]=""; hash["format"]="clause(+A,+I1,+I2,-C)"; hash["argument"]="A:取り出す節の述語名を指定する
I1:取り出す節のアリティを指定する
I2:取り出す節の指定(上から第何番目か)を指定する
C:取り出された節がユニファイされる"; hash["text"]="述語名A、アリティI1の頭部を持つ節の上からI2番目の節をCにユニファイするユーザ側定義節・システム側定義節を問わず取り出します。
該当の節がない場合この述語は失敗します。
「標準組込み述語」「コンパイル組込み述語」「Cリンク組込み述語」は取り出せません。"; hash["reference"]="「(操)9.5コンパイルコードとインタープリタコードの動作上の違い」"; hash["sample"]="| ?-listing.
a(1).
a(2).
a(3).
a(1,1) :- write(abc),nl.
a(1,2) :- write(def),nl.
a(2,1) :- write(ghi),nl.
yes
| ?-clause(a,1,1,C).
C = a(1)
yes
| ?-clause(a,2,2,C).
C = a(1,2) :- write(def),nl
yes"; hash["genre"]="16"; hash["used"]="true"; hash["incident"]="clause/2
clause/3"; azlist.push(hash); var hash={}; hash["id"]="27"; hash["name"]="=.. /xfx"; hash["common"]="ISO"; hash["format"]="?T =.. ?L"; hash["argument"]="T:分解する項を与える。又は、組立てた項がユニファイされる。
L:項を分解したリストがユニファイされる。又は項を組立てる為のリストを与える。"; hash["text"]="項TをリストLの要素に分解し、また逆にリストLの要素から項Tを組立てます。本述語はユニブと呼ばれています

項Tが述語表現の複合項である場合は、その述語名を第一番目の要素に、引数を二番目以降の要素にしたリストLに変換してLにユニファイします。またその逆も変換できます。
例)a(1,2,3) =.. [a,1,2,3]

項Tが演算子形式の場合は最も結合の優先順位の低い演算子を第一番目の要素に、その演算子の左側を第二番目の要素に、その演算子の右側を第三番目の要素とした三要素のリストに変換してLにユニファイします。またその逆も変換できます。
例)1*2+3*4 =.. [+,1*2,3*4]

項Tがリストの場合はピリオド「.」を第一番目の要素とし、Tの第一番目の要素を第二番目の要素に、Tの残りのリストを第三番目の要素とした三要素のリストに変換してLにユニファイします。またその逆も変換できます。
例)[1,2,3,4] =.. [.,1,[2,3,4]]

Tがアトムの場合はそのアトムを唯一の要素とするリストに変換してLにユニファイします。
例)abcd =.. [abcd]

※この述語で作った項をゴールとして用いて述語を call している節をコンパイルして作った「コンパイル済み述語」は正常に動作しない事があります。"; hash["reference"]="「(操)9.5コンパイルコードとインタープリタコードの動作上の違い」"; hash["sample"]="| ?-a(1,2,3)=..X.
X = [a,1,2,3]
yes
| ?-X =.. [a,1,2,3].
X = a(1,2,3)
yes
| ?-1*2+3*4 =.. X.
X = [+,1*2,3*4]
yes
| ?-X =.. [+,1*2,3*4].
X = 1*2+3*4
yes
| ?-[1,2,3,4] =.. X.
X = [.,1,[2,3,4]]
yes
| ?-X =.. [.,1,[2,3,4]].
X = [1,2,3,4]
yes
| ?-abcd =.. X.
X = [abcd]
yes
| ?-X =.. [abcd].
X = abcd
yes"; hash["genre"]="17"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="28"; hash["name"]="arg/3"; hash["common"]="ISO"; hash["format"]="arg(+I,+T1,-T2)"; hash["argument"]="
I :T1の第何番目の引数かを整数で指定
1 ≦ I ≦ (T1のアリティ)
T1 :引数の値を取り出したい複合項
T2 :T1のI番目の引数の値がユニファイされる
"; hash["text"]="T1のI番目の引数の値をT2にユニファイします。
ただし、Iは1 ≦ I ≦ (T1のアリティ)の範囲にないときは失敗します。
リストは第1番目の要素とそれ以降の要素を引数とするアリティが2の複合項と見なされます。
T1が数式の場合は結合の優先順位の最も低い演算子の左と右を引数とするアリティが2の複合項と見なされます。"; hash["reference"]=""; hash["sample"]="| ?-arg(1,a(1,2,3),X).
X = 1
yes
| ?-arg(2,a(1,2,3),X).
X = 2
yes
| ?-arg(4,a(1,2,3),X).
no
| ?-arg(1,[1,2,3],X).
X = 1
yes
| ?-arg(2,[1,2,3],X).
X = [2,3]
yes
| ?-arg(3,[1,2,3],X).
no
| ?-arg(1,1*2+3*4,X).
X = 1*2
yes
| ?-arg(2,1*2+3*4,X).
X = 3*4
yes
| ?-arg(3,1*2+3*4,X).
no"; hash["genre"]="17"; hash["used"]="true"; hash["incident"]="=.. /xfx"; azlist.push(hash); var hash={}; hash["id"]="29"; hash["name"]="call/1"; hash["common"]="ISO"; hash["format"]="call(+T) X・・・値Tを持つ変数。未代入の変数は許されない。"; hash["argument"]="T:ゴールとなりうる項。"; hash["text"]="項Tとユニファイ可能な頭部を持った述語を呼出します。
通常は項T(又はその値を持つ変数)を直接ゴールとして書く事が許される為call/1 を使う意味は有りません。
今、次のようなプログラムをコンパイルして、実行しようとした場合、=..で作った項をcallしようとしてもfailします。
a:-A=..[b,X],call(A).
b(1).
この場合は
:-public b/1.
の宣言が必要です。"; hash["reference"]="「(操)9.5コンパイルコードとインタープリタコードの動作上の違い」"; hash["sample"]="| ?-X=true,call(X).
X=true
yes
| ?-X=true,X.
X=true
yes"; hash["genre"]="17"; hash["used"]="true"; hash["incident"]="true/0"; azlist.push(hash); var hash={}; hash["id"]="30"; hash["name"]="s_sort/2"; hash["common"]=""; hash["format"]="s_sort(+T,-A)"; hash["argument"]="
T: 調べたい述語とユニファイ可能なアトム又は複合項
複合項の引数は数さえ合っていれば、値は関係無いので匿名変数で埋めても良い
A: Tとユニファイ可能な述語が存在すればその種類を次のアトムで返される
「builtin」・・・「標準組み込み述語」「コンパイル組み込み述語」「Cリンク組み込み述語」のいずれか
「system」・・・システム述語
「user」・・・・・・ユーザ定義述語
"; hash["text"]="Tとユニファイ可能な述語が存在すればその種類を表すアトムをAにユニファイします。
そのような述語が存在しない場合には失敗します。"; hash["reference"]="「(操)5.11定義述語の種類」
"; hash["sample"]="いま、a/1 というユーザ定義述語であり、
b/1 というシステム述語がヒープ領域に登録されているとすると・・・

| ?-s_sort(a(_),X).
_ = _,
X = user
yes
| ?-s_sort(write(_),X).
_ = _,
X = builtin
yes
| ?-s_sort(b(_),X).
_ = _,
X = system
yes
| ?-s_sort(c(_),X).
no"; hash["genre"]="17"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="31"; hash["name"]="functor/3"; hash["common"]="ISO"; hash["format"]="functor(?T,?A・I1,?I2)"; hash["argument"]="
T :調べたい項を入力するか、組立てられた複合項、又はアトムか整数値がユニファイされる
A・I1 :Tが複合項の場合はその複合項の述語名(ファンクタ名)がユニファイされる
Tがアトムか整数値の場合はそのアトムか整数値がそのままユニファイされる
Tが未代入の変数でかつI2が0の場合、ここにアトムか整数値を入力すると
Tにそのアトムか整数値がそのままユニファイされる
I2 :Tが複合項の場合はその複合項のアリティがユニファイされる
Tがアトムか整数値の場合は0がユニファイされる
ここに0を入力すると、アトムか整数値に限ってTとA・I1が双方向にユニファイされる
"; hash["text"]="「複合項」とその「述語名とアリティ」間で双方向にユニファイします。
つまり、Tに「複合項」が入力されるとその「述語名とアリティ」をそれぞれAとI2に出力し、逆にAとI2それぞれに「述語名とアリティ」が入力されるとその「複合項(引数は未代入の変数になる)」を出力します。
また、Tがアトムか整数値が入力されると、そのアトムか整数値をA・I1にそのままユニファイし、I2には0をユニファイします。
その逆にA・I1にアトムか整数値、I2に0が入力されると、そのアトムか整数値をTにそのままユニファイします。
Tが未代入の変数である場合、A・I1かI2のどちらか一方でも未代入の変数である事は許されません。(エラー{Illegal argument supplied}になります)"; hash["reference"]=""; hash["sample"]="| ?-functor(a(1,2),F,I).
F = a,
I = 2
yes
| ?-functor(T,a,2).
T = a(A_6,B_6) <==複合項の引数は変数になります。変数名は不定
yes
| ?-functor(abc,F,I).
F = abc,
I = 0
yes
| ?-functor(123,F,I).
F = 123,
I = 0
yes
| ?-functor(abc,F,0).
F = abc
yes
| ?-functor(123,F,0).
F = 123
yes
| ?-functor(1.23,F,0).
F = 1.23000000000000
yes
| ?-functor(T,abc,0).
T = abc
yes
| ?-functor(T,123,0).
T = 123
yes
| ?-functor(T,1.23,0).
T = 1.23000000000000
yes
| ?-functor(T,1.23,N). <==エラーになります。
Illegal Argument supplied ----- Backtrace
functor(T,1.23000000000000,N)
| ?-"; hash["genre"]="17"; hash["used"]="true"; hash["incident"]="=.. /xfx"; azlist.push(hash); var hash={}; hash["id"]="32"; hash["name"]="atom/1"; hash["common"]="ISO"; hash["format"]="atom(+T)"; hash["argument"]="T:調べたい項"; hash["text"]="Tがアトムの場合のみ成功します。それ以外は失敗します。
Tは入力引数ですが未代入の変数でもエラーにはなりません、勿論この場合アトムではないので失敗します。"; hash["reference"]="「(述)2.2トークン(データ構成)」"; hash["sample"]="| ?-atom(abc).
yes
| ?-atom(123).
no
| ?-atom(1.23).
no
| ?-atom([a,b,c]).
no
| ?-atom(X).
no
| ?-X=abc,atom(X).
X = abc
yes"; hash["genre"]="18"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="33"; hash["name"]="atomic/1"; hash["common"]="ISO"; hash["format"]="atomic(+T)"; hash["argument"]="T:調べたい項"; hash["text"]="Tがアトムか又は数値の場合のみ成功します。それ以外は失敗します。
Tは入力引数ですが未代入の変数でもエラーにはなりません、勿論アトムでも、整数値でもないので失敗します。

ver.7以前と仕様が異なりますので注意してください。"; hash["reference"]="「(述)2.2トークン(データ構成)」"; hash["sample"]="?-atomic(abc).
yes
?-atomic(123).
yes
?-atomic(1.23).
yes
?-atomic([a,b,c]).
no
?-atomic(X).
no
?-X=abc,atomic(X).
X = abc
yes"; hash["genre"]="18"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="34"; hash["name"]="float/1 (1)"; hash["common"]="ISO"; hash["format"]="float(+T)"; hash["argument"]="T:調べたい項"; hash["text"]="Tが実数の場合のみ成功します。それ以外は失敗します。
Tは入力引数ですが未代入の変数でもエラーにはなりません、勿論この場合実数ではないので失敗します。"; hash["reference"]="「(述)2.2トークン(データ構成)」"; hash["sample"]="| ?-float(abc).
no
| ?-float(123).
no
| ?-float(1.23).
yes
| ?-float([a,b,c]).
no
| ?-float(X).
no
| ?-X=1.23,float(X).
X = 1.23000000000000
yes
| ?-"; hash["genre"]="18"; hash["used"]="true"; hash["incident"]="float/1 (2)"; azlist.push(hash); var hash={}; hash["id"]="35"; hash["name"]="integer/1 (1)"; hash["common"]="ISO"; hash["format"]="integer(+T)"; hash["argument"]="T:調べたい項"; hash["text"]="Tが整数の場合のみ成功します。それ以外は失敗します。
Tは入力引数ですが未代入の変数でもエラーにはなりません、勿論この場合整数ではないので失敗します。"; hash["reference"]="「(述)2.2トークン(データ構成)」"; hash["sample"]="| ?-integer(abc).
no
| ?-integer(123).
yes
| ?-integer(1.23).
no
| ?-integer([a,b,c]).
no
| ?-integer(X).
no
| ?-X=123,integer(X).
X = 123
yes"; hash["genre"]="18"; hash["used"]="true"; hash["incident"]="integer/1 (2)"; azlist.push(hash); var hash={}; hash["id"]="36"; hash["name"]="number/1"; hash["common"]="ISO"; hash["format"]="number(+T)"; hash["argument"]="T:調べたい項"; hash["text"]="Tが数値(実数又は整数)の場合のみ成功します。それ以外は失敗します。
Tは入力引数ですが未代入の変数でもエラーにはなりません、勿論この場合、数値ではないので失敗します。"; hash["reference"]="「(述)2.2トークン(データ構成)」"; hash["sample"]="| ?-number(abc).
no
| ?-number(123).
yes
| ?-number(1.23).
yes
| ?-number([a,b,c]).
no
| ?-number(X).
no
| ?-X=1.23,number(X).
X = 1.23000000000000
yes"; hash["genre"]="18"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="37"; hash["name"]="list/1"; hash["common"]=""; hash["format"]="list(+T)"; hash["argument"]="T:調べたい項"; hash["text"]="Tがリストの場合のみ成功します。それ以外は失敗します。
ただし、空リスト「[]」は文法的にはリストでなくアトムなので失敗します。
Tは入力引数ですが未代入の変数でもエラーにはなりません、勿論この場合リストではないので失敗します。"; hash["reference"]="「(述)2.2トークン(データ構成)」"; hash["sample"]="| ?-list(abc).
no
| ?-list(123).
no
| ?-list(1.23).
no
| ?-list([a,b,c]).
yes
| ?-list(X).
no
| ?-X=[a,b,c],list(X).
X = [a,b,c]
yes"; hash["genre"]="18"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="38"; hash["name"]="var/1"; hash["common"]="ISO"; hash["format"]="var(+T)"; hash["argument"]="T:調べたい項"; hash["text"]="Tが未代入の変数の場合のみ成功します。
それ以外は失敗します。"; hash["reference"]="「(述)2.2トークン(データ構成)」"; hash["sample"]="| ?-var(abc).
no
| ?-var(123).
no
| ?-var(1.23).
no
| ?-var([a,b,c]).
no
| ?-var(X).
X=X
yes
| ?-X=abc,var(X).
no"; hash["genre"]="18"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="39"; hash["name"]="nonvar/1"; hash["common"]="ISO"; hash["format"]="nonvar(+T)"; hash["argument"]="T:調べたい項
入力引数だが未代入の変数でもエラーにはならない"; hash["text"]="Tが未代入の変数の場合にのみ失敗します。それ以外は成功します。
つまり、\\+ var(+T) とまったく同じです。"; hash["reference"]="「(述)2.2トークン(データ構成)」"; hash["sample"]="| ?-nonvar(abc).
yes
| ?-nonvar(123).
yes
| ?-nonvar(1.23).
yes
| ?-nonvar([a,b,c]).
yes
| ?-nonvar(X).
no
| ?-X=abc,nonvar(X).
X = abc
yes"; hash["genre"]="18"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="40"; hash["name"]="name/2"; hash["common"]=""; hash["format"]="name(?A・N,?L)"; hash["argument"]="
A・N :「文字コードリスト」に変換したい「アトム又は数値」を指定する(ただし、数式を指定する事は許されない。
又は「文字コードリスト又はストリング」から変換された「アトム又は数値」がユニファイされる。
L :「アトム又は数値」に変換したい「文字コードリスト又はストリング」を指定する。
又は「アトム又は数値」から変換された「文字コードリストがユニファイされる。
"; hash["text"]="漢字などの多バイト(全角)文字を含むアトムを変換した場合に返される文字コードリストの要素は、現在の漢字モードによって次の様に異なります。

<漢字モードがonの場合>
一文字分の漢字コード(多バイト)を32ビット整数とした値(10進表現)を返される文字コードリストの1要素とします。
例)漢字 というアトムを変換すると [35519,36506] となります。(Windows)


<漢字モードがoffの場合>
一文字分の漢字コード(多バイト)をバイト単位に分割してそれぞれを32ビット整数の下位8ビットとした値(10進表現)を返される。
文字コードリストの2要素とします。つまり、漢字1文字で2要素となります。(Prolog-KABAと同じ)
例)「漢字」というアトムを変換すると [138,191,142,154] となります。(Windows)

数値の場合もその数字列のコードの並びを要素とするリストに変換します。
2バイト文字のコードリストからアトム・数値に変換する場合は、漢字モードには関係無く、上の「1文字1要素表現」、「1文字2要素表現」どちらでも書く事が出来ますし結果も同じになります。
ストリングの場合は「" "」で囲った文字列がそのままアトム・数値に変換されます。この際の文字列はアトムとして許されないような文字列でも構いません。
また、変換した結果が数値として認められるような文字列の場合は数値となります。
したがってこの述語では変換した結果が数値として認められるような文字列をアトムにする事はできません。
引数のAにアトム・数値以外、又はLにリスト以外の項を与えるとエラー(Illegal argument supplied)になります。"; hash["reference"]="「(操)5.8日本語処理と漢字モード」
「(述)2.2トークン(データ構成)」"; hash["sample"]="| ?-name('Panda',X).
X = [80,97,110,100,97]
yes
| ?-name(123,X).
X = [49,50,51]
yes
| ?-kanji_mode(X,X). <== 漢字モードがonである事を確認します。
X = on
yes
| ?-name(漢字,X).
X = [35519,36506]
yes
| ?-name(X,[35519,36506]),atom(X).
X = 漢字
yes
| ?-kanji_mode(_,off). <== 漢字モードがoffに切換えます。
_0 = on
yes
| ?-name(漢字,X).
X = [138,191,142,154]
yes
| ?-name(X,[80,97,110,100,97]),atom(X).
X = Panda
yes
| ?-name(X,[138,191,142,154]),atom(X).
X = 漢字
yes
| ?-name(X,"ミカン ト リンゴ"),atom(X).
X = ミカン ト リンゴ
yes
| ?-name(X,"1.2"),float(X).
X = 1.20000000000000
yes
| ?-"; hash["genre"]="19"; hash["used"]="true"; hash["incident"]="kanji_mode/2
atom_codes/2
number_codes/2"; azlist.push(hash); var hash={}; hash["id"]="41"; hash["name"]="term_atom/2"; hash["common"]=""; hash["format"]="term_atom(?T,?A)"; hash["argument"]="
T: アトムに変換したい項を指定する。又はアトムから変換された項がユニファイされる。
A: 項に変換したいアトムを指定する。又は項から変換されたアトムがユニファイされる。
"; hash["text"]="項とアトムを相互(双方向)に変換します。

つまり、
a(X) ←→ 'a(X)'{複合項 ←→ アトム}
1234 ←→ '1234'{数値 ←→ アトム}

などの変換が可能です。

・第1引数は項または変数、第2引数はアトム(65,535文字以内)または変数をそれぞれあてはめます。
・複合項をアトムに変換した結果、そのアトムのバイト数が65,53バイトを越えた場合は失敗します。
・変換しようとする複合項に値が定まってない変数が含まれているか、変換しようとするものが値が定まってない変数そのものであるとき、その変数名は保証されません。(アトムになった時に変数名が変ります)
・複合項になったとき不完全(括弧の数が合わないなど)になるようなアトムを複合項に変換しようとした場合はエラー(Syntax error)になります。
"; hash["reference"]="「(述)2.2トークン(データ構成)」"; hash["sample"]="| ?-term_atom(X,'123'),integer(X).
X = 123
yes
| ?-term_atom(a(X),'a(123)').
X = 123
yes
| ?-term_atom(X,'a(').
syntax error
| ?-term_atom(123,X),atom(X).
X = 123
yes
| ?-term_atom(aaa,X).
X = aaa
yes"; hash["genre"]="19"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="42"; hash["name"]="atom_append/3"; hash["common"]=""; hash["format"]="atom_append(+A1,+A2,-A3)"; hash["argument"]="
A1,A2 :結合するアトム
A3 :A1とA2を結合したアトム
"; hash["text"]="A1とA2のアトムを結合したアトムをA3にユニファイします。

結合したアトムの大きさが65,535バイトより大きくなる時は失敗します。
次の定義と同義です。

atom_append(A,B,C) :- name(A,L1),name(B,L2),
           append(L1,L2,L3),!,name(C,L3)."; hash["reference"]=""; hash["sample"]="| ?-atom_append(abc,def,X).
X = abcdef
yes"; hash["genre"]="19"; hash["used"]="true"; hash["incident"]="name/2"; azlist.push(hash); var hash={}; hash["id"]="43"; hash["name"]="atom/2"; hash["common"]=""; hash["format"]="atom(+A,-I)"; hash["argument"]="
A :長さを調べたいアトム
I :Aの長さ(文字数)がユニファイされる
"; hash["text"]="Aの長さ(文字数)をIにユニファイします。
kanji_modeがonのときには、漢字等でない1バイト文字は1文字として数えられ、kanji_modeがoffのときには、多バイト文字はそのバイト数の文字として数えられます。ISOのatom_length/2と同じです。"; hash["reference"]=""; hash["sample"]="| ?-atom(abc,X).
X = 3
yes
| ?-atom(あいう,X).
X = 3
yes

| ?-kanji_mode(_,off).
_0 = on
yes
| ?-atom(あいう,X).
X = 6
yes
| ?-"; hash["genre"]="19"; hash["used"]="true"; hash["incident"]="atom_length/2
kanji_mode/2"; azlist.push(hash); var hash={}; hash["id"]="44"; hash["name"]="length/2"; hash["common"]=""; hash["format"]="length(+L,-I) or length(?L,+I)"; hash["argument"]="L:要素数を調べたいリスト
I:Lの要素数がユニファイします"; hash["text"]="Lの要素数をIにユニファイします。
要素数を指定した場合、その要素数のリストを返します。


※リストの尾部が [] で終了していない場合は結果は保証されません。
特に環リストになっている場合は無限ループに陥って終了しなくなります。

?-A=[a|A],length(A,Z)."; hash["reference"]=""; hash["sample"]="| ?-length([a,b,c],X).
X = 3
yes

| ?-length(L,2).
L = [_1,_2]
yes
"; hash["genre"]="19"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="45"; hash["name"]="!/0"; hash["common"]="ISO"; hash["format"]="!"; hash["argument"]="なし"; hash["text"]="(1)「カットオペレータ」又は「カット」と呼ばれ、ある同じ述語名、アリティの頭部を持つ節の集りである述語のなかで、このカットを最初に実行したときは必ず成功しますが、バックトラックによって後戻りしてきた場合にはこの述語は必ず失敗します。
つまり、カットの左側に別の可能性を持ったゴールが在ってもその可能性は試みられません。
通常カットの有効範囲はその述語内だけです。
つまり、ある述語にカットがあるとカットまでバックトラックによって後戻りしてきた場合にその述語を失敗します。

(2)" , " ゴール(列)およびこれを引き数とする組込述語 call,errorset,catchなどの中ではそのゴール(列)の範囲内でカットは有効です。
これらの範囲を超えて制御を行いたいときには catch/2 throw/1 をお勧めします。"; hash["reference"]=""; hash["sample"]="(1)
a :- a(X),write(X),nl,fail.
a.
a(1).
a(2).
a(3).
b :- b(X),!,write(X),nl,fail.
b.
b(1).
b(2).
b(3).

このaとbの述語の違いはカットの有無だけです。
これらを実行してみると、次の様になります。

| ?-a.
1
2
3
yes
| ?-b.
1
no
aを実行すると最後のfailでバックトラックしてきた時に
a/1に別の可能性があるので試し次の値をXにユニファイし次々とwrite/1で画面に出力します。
a/1の別の可能性が無くなると、aの次の節とマッチして成功して終ります。
他方、bは最初、aと同じ様に b/1 の一つ目の節とマッチし、Xに1をユニファイして、
カットを実行後、 write/1 で画面に出力しますが、最後のfailでバックトラックしてきた時に、
b/1 の別解を探す事なく、bの次の節にも行かずにbがそのまま 失敗します。


(2)AZ-Prologのカットオペレータ有効範囲は、
call/1, -> /2 などの組込述語内および"("と")" で
意図的にブロッキングされたゴール列内に制限されますが
これを超えたバックトラック制御は、catch/2,throw/1 で実現します。

| a(1).
| a(2).
| a(3).

<SWI-Prolog>
?- a(X),(X>1->!;true),write(X),fail.
12
false.

<AZ-Prolog>
| ?-a(X),(X>1->!;true),write(X),fail.  %カットの有効範囲が組込述語"->/2"内
123
no

%*******************************************************************%
% catch/2,throw/1でSWIと同様なゴール列内バックトラックを実現する %
%*******************************************************************%

| ?-catch(tag,(a(X),(X>1 -> throw(tag);true))),write(X),fail.
12
no
"; hash["genre"]="20"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="46"; hash["name"]="-> /xfy"; hash["common"]="ISO"; hash["format"]="C1 -> C2;C3、C1 -> C2"; hash["argument"]="C1,C2,C3はどれもゴール又はゴールの並びとする"; hash["text"]="C1の実行が成功した時C2を実行し、失敗した時C3を実行します。
a :- b -> c;d.

a :- b,!,c.
a :- d.
は全く等価です。
つまり、b に他の可能性が有り c や d 以降からバックトラックしてきても、b の他の可能性は試されずに a が失敗します。
この2通りの書き方のどちらを使うかはプログラマの自由てすが、後者の方がよりProlog的な書き方であると言えます。
また、-> を多用するとプログラムの動きが分りにくくなり、プログラムの保守性が悪くなる恐れもあります。
なお、C1 -> C2 は C1 -> C2;fail と等価です。"; hash["reference"]=""; hash["sample"]="| ?-listing.
a(X) :-
(X=:=0->write(a1);write(a2)).
b :-
(b(X),write(X)->write(bbbb),nl),
fail.
b(1).
b(2).
b(3).
yes
| ?-a(0).
a1
yes
| ?-a(1).
a2
yes
| ?-b.
1bbbb
no <==最後の fail によって後戻りしてきても<
b/1の別の可能性は試されないまま失敗します
"; hash["genre"]="20"; hash["used"]="true"; hash["incident"]="fail/0
!/0"; azlist.push(hash); var hash={}; hash["id"]="47"; hash["name"]="; /xfy"; hash["common"]="ISO"; hash["format"]="C1;C2"; hash["argument"]="C1、C2:共にゴールまたはゴールの並び"; hash["text"]="C1、C2のどちらかが成功すれば成功します。
正確には次の様な動きをします。
まずC1の実行に成功した場合はC2は実行されず、C2以降の実行に移ります。
そしてC2以降のゴールの実行に失敗しバックトラック(後戻り)してきたときにC1にオルタネィティブがない(他の可能性がない)場合はC2が実行されます。
(ただし、C1か、C2と失敗したゴールの間にカット「! /0」が含まれる場合C2は実行されずにその述語が失敗します)
C1が失敗するとすぐC2が試されます。
また、例えば
a :- b;c.

a :- b.
a :- c.
は等価です。
この2通りの書き方のどちらを使うかはプログラマの自由てすが、後者の方がよりProlog的な書き方であると言えます。
また、「->」と同様に「;」を多用するとプログラムの動きが分りにくくなりプログラムの保守性が悪くなる恐れもあります。"; hash["reference"]=""; hash["sample"]="| a(X) :- (true ;write(aaaaa)),X =:= 0. 節が定義されているとすると
| ?-a(0). <== true が成功するので write(aaaaa) を実行せず、X =:= 0を試して
yes        成功するのでa/1も成功する。
| ?-a(1). <== true が成功するので write(aaaaa) を実行せず、X =:= 0を試すが
aaaaano 失敗するので後戻りして write(aaaaa) を実行し、再度 X =:= 0
| ?- を試すが状況が変わらず失敗するのでa/1も失敗する。"; hash["genre"]="20"; hash["used"]="true"; hash["incident"]="!/0
-> /xfy
"; azlist.push(hash); var hash={}; hash["id"]="48"; hash["name"]="¥+ /fy"; hash["common"]="ISO"; hash["format"]="¥+ C"; hash["argument"]="C:共にゴールまたはゴールの並び
ただし、ゴールの並びの場合はその並びを「()」で括ること"; hash["text"]="Cの成功・失敗を反転します。
つまり、Cが成功すると失敗させ、Cが失敗すると成功させます。
また、
a(X) :- ¥+ X.

a(X) :- X,!,fail.
a(_).
は等価です。"; hash["reference"]=""; hash["sample"]="| ?- ¥+ fail.
yes
| ?- ¥+ true.
no
| a(1).
| a(2).
| a(3).
| ?- ¥+((a(X),write(X),fail)).
123
X = X
yes
"; hash["genre"]="17"; hash["used"]="true"; hash["incident"]="!/0
fail/0
"; azlist.push(hash); var hash={}; hash["id"]="49"; hash["name"]="true/0"; hash["common"]="ISO"; hash["format"]="true"; hash["argument"]="なし"; hash["text"]="常に必ず成功します。
ただし、決定性述語ですから成功するのは最初の1回だけでバックトラックしてきても、再び成功する事は有りません。
従って通常は節のゴールとして書いてもあまり意味が有りません。
代表的な使い方はif~then~制御で
X -> Y;true
と書いておくと、Xが成功した時のみYを実行し、Xが失敗しても何もせずに成功させるという事が出来ます。
"; hash["reference"]=""; hash["sample"]="| ?-listing.
a(X) :-
(X=:=0->write(aaaa);true).
yes
| ?-a(0).
aaaa
yes
| ?-a(1).
yes"; hash["genre"]="20"; hash["used"]="true"; hash["incident"]="-> /xfy
call/1
"; azlist.push(hash); var hash={}; hash["id"]="50"; hash["name"]="fail/0"; hash["common"]="ISO"; hash["format"]="fail"; hash["argument"]="なし"; hash["text"]="常に必ず失敗します。
主に失敗させる事によって強制的にバックトラックを起こし別解を求める時に使います。
repeat/0 と合せて無限ループを構成する事が出来ます。"; hash["reference"]=""; hash["sample"]="a :- a(X),write(X),nl,fail.
a.
a(1).
a(2).
a(3).
yes
| ?-a. <==プログラムを実行すると、a/1 の全解が得られます。
1
2
3
yes

b :- repeat,write(b),fail. <==これは無限ループの例です。
| ?-b.
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbb・・・・・・・"; hash["genre"]="20"; hash["used"]="true"; hash["incident"]="repeat/0
repeat/1"; azlist.push(hash); var hash={}; hash["id"]="51"; hash["name"]="repeat/0"; hash["common"]="ISO"; hash["format"]="repeat"; hash["argument"]="なし"; hash["text"]="何回でも成功する述語です。
つまりこの述語以降でゴールが失敗して後戻りしてきた時、何回でも成功します。"; hash["reference"]=""; hash["sample"]="b :- repeat,write(b),fail. <==これは無限ループの例です。
| ?-b.
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbb・・・・・・・



type(F) :- see(F),repeat,get0(X),ttyput(X),X=:=26,seen.
yes 任意のテキストファイルを一文字単位で入力して画面に出力する。
ファイルの「end of file」(キャラクタコード:26とする)を読み込むまで
一文字単位の入出力を繰返すために repeat が用いられている。

| ?-type('abc.txt').
abcdefghijklmnopqrstuvwxyz
yes"; hash["genre"]="20"; hash["used"]="true"; hash["incident"]="fail/0
repeat/1
once/1"; azlist.push(hash); var hash={}; hash["id"]="52"; hash["name"]="repeat/1"; hash["common"]=""; hash["format"]="repeat(-I)"; hash["argument"]="I:バックトラック(後戻り)によって成功した回数がユニファイされる"; hash["text"]="何回でも成功する述語です。(Iが未代入の変数の場合)
つまり、この述語以降でゴールが失敗してバックトラック(後戻り)してきた時、何回でも成功します。
repeat/0 との違いはバックトラックによって成功した回数を引数にユニファイする点です。
これにより回数を限定した繰返し処理が可能です。"; hash["reference"]=""; hash["sample"]="| ?-repeat(I),write(I),nl,I=:=10.
0
1
2
3
4
5
6
7
8
9
10
I = 10
yes"; hash["genre"]="20"; hash["used"]="true"; hash["incident"]="fail/0
repeat/0
once/1"; azlist.push(hash); var hash={}; hash["id"]="53"; hash["name"]="catch/2"; hash["common"]=""; hash["format"]="catch(+A・I,+C)"; hash["argument"]="
A・I :識別タグをアトムか整数で指定
C :呼出すゴールを指定
"; hash["text"]="Cで呼出された節又はその節から呼出されたそれ以下のレベルの節にあるA・Iで指定された識別タグと同じ識別タグを引数に持つ throw/1 が実行されると一気にこの catch/2 まで制御が戻されます。
ただし、同じ識別タグを持つ catch/2 が途中のレベルにあるとそこまでしか戻りません。
また、一旦、catch/2 まで制御が戻されるとCに別の可能性(選択肢)があってもそれを試す(実行する)事はしません。
(決定性述語になります)
この実行制御の方法はAZ-Prolog独自のものですのでPrologの入門書などには出てきません。
そのため動きを理解するのに少々難しいかもしれません。
そこでデバッグモードのトレースを用いると比較的容易に理解出来ます。"; hash["reference"]=""; hash["sample"]="| a:- catch(a,go(X)).
| go(X):- repeat,read(X),do(X),fail.
| do(exit):- throw(a).
| do(X):- write(X).
| ?-a.
|: bb.
bbbbbb|:
|:
|: exit.
yes
| ?-"; hash["genre"]="20"; hash["used"]="true"; hash["incident"]="throw/1"; azlist.push(hash); var hash={}; hash["id"]="54"; hash["name"]="throw/1"; hash["common"]=""; hash["format"]="throw(+A・I)"; hash["argument"]="A・I:戻りたい catch/2 の識別タグを指定"; hash["text"]="この述語がある節を呼びたした節又はそれ以上のレベルの節を呼出した catch/2 の中でA・Iで指定した識別タグと同じ識別タグを持つ catch/2 まで一気に戻ります。
その様な catch/2 が複数個ある場合は最も近いレベルの catch/2 まで戻ります。
もし、その様な catch/2 が存在しない場合はエラー(Illegal catch tag)となります。"; hash["reference"]=""; hash["sample"]="catch/2 の[実行例]参照"; hash["genre"]="20"; hash["used"]="true"; hash["incident"]="catch/2"; azlist.push(hash); var hash={}; hash["id"]="55"; hash["name"]="abort/0"; hash["common"]=""; hash["format"]="abort"; hash["argument"]="なし"; hash["text"]="処理を中止してトップレベルに戻します。画面には abort と表示されます。
オープンされていたファイルはすべてクローズされ、現在の入出力ストリームは「user」に切換えられます。
この述語が実行されてもブレークレベルは変化しません。
なお、abort はエラー番号255のシステムエラー(abort/0 code)と同等です。
従って、errorset で捕まえる事が出来ます。"; hash["reference"]=""; hash["sample"]="| ?-tell(test1),write(aaaaaaaaaa),abort.
| ?-telling(X). <==abort が 画面表示されません。要確認。
X = user
yes
| ?-errorset(abort,E).
E = 255
yes"; hash["genre"]="21"; hash["used"]="true"; hash["incident"]="errorset/2"; azlist.push(hash); var hash={}; hash["id"]="56"; hash["name"]="break/0"; hash["common"]=""; hash["format"]="break"; hash["argument"]="なし"; hash["text"]="実行を保留して、インタ-プリタは別のコマンドレベルに移行します。これをブレークレベルといいます。
ブレークレベルでの実行中に再び別のブレークをすることもできます。
現在のブレークレベルまでに重なっているブレークレベルの数がプロンプト(?-)の上の行に表示されます。
abort/0 とは異なり、unbreak/0,unbreak/1 によって実行を再開することができます。
また、実行を中断したまま別の(あるいは同じ)プログラムを走らせることができます。
この場合、その中でも、もう一度break/0 を使うこともできます。"; hash["reference"]="「(操)5.5.1インタープリタの実行の中断(ブレークレベル)」
"; hash["sample"]="| ?-write(aaa),nl,X=bbb,break,write(X),nl.
aaa
[1]
| ?-unbreak.
bbb
X = bbb
yes

この例は先ず write(aaa),nl で aaa を表示し変数 X に bbb をユニファイ(代入)し、
次の break で別のコマンドレベルにします。
そのレベルでunbreakを実行すると処理が break の直後から再開されて
break以前に X に代入された bbb が write(X),nl で表示された事を示しています。
つまり、実行再開のための実行順序や変数の値がすべて保存されている事を示しています。
"; hash["genre"]="21"; hash["used"]="true"; hash["incident"]="abort/0
unbreak/0
unbreak/1
"; azlist.push(hash); var hash={}; hash["id"]="57"; hash["name"]="unbreak/0"; hash["common"]=""; hash["format"]="unbreak"; hash["argument"]="なし"; hash["text"]="break/0 によって中断された実行を再開します。
詳細は break/0 を参照して下さい。"; hash["reference"]="「(操)5.5.1インタープリタの実行の中断(ブレークレベル)」
"; hash["sample"]="| ?-write(aaa),nl,X=bbb,break,write(X),nl.
aaa
[1]
| ?-unbreak.
bbb
X = bbb
yes"; hash["genre"]="21"; hash["used"]="true"; hash["incident"]="abort/0
break/0
unbreak/1"; azlist.push(hash); var hash={}; hash["id"]="58"; hash["name"]="unbreak/1"; hash["common"]=""; hash["format"]="unbreak(+I)"; hash["argument"]="I:相対レベルを指定"; hash["text"]="現在のブレークレベル数からIを引いたブレークレベルのプログラムの実行を再開します。よって、Iが1の時は unbreak と全く同じように動作します。
現在のブレークレベルと、そこからIを引いたブレークレベルの間の中断されている実行はキャンセルされます。
(二度と実行の再開はできません)。
また、Iに0又は現在のレベル数以上の数値を設定すると、すべての中断されている実行がキャンセルされます。"; hash["reference"]="「(操)5.5.1インタープリタの実行の中断(ブレークレベル)」
"; hash["sample"]="| ?-break,write(aaa).
[1]
| ?-break,write(bbb).
[2]
| ?-break,write(ccc).
[3]
| ?-break,write(ddd).
[4]
| ?-break,write(eee).
[5]
| ?-unbreak(3).
ccc
yes
[2]
| ?-

この例ではブレークを次々にかけて現在のブレークレベルを5としました。
そこで unbreak(3) を実行すると5-3でブレークレベル2の実行を再開して、
write(ccc) が実行されて、ccc が表示された事を示しています。
また、この場合、ブレークレベル3と4(つまり、write(ddd)とwrite(eee))は
キャンセルされるため、これらの実行再開は不可能となります。
"; hash["genre"]="21"; hash["used"]="true"; hash["incident"]="abort/0
break/0
unbreak/0"; azlist.push(hash); var hash={}; hash["id"]="59"; hash["name"]="manual/1"; hash["common"]=""; hash["format"]="manual(+T)"; hash["argument"]="T:「述語名」または「述語名/引数」の書式で標準組込み述語を指定する
キーワードを指定する"; hash["text"]="Tで指定される標準組込み述語の説明を画面に表示します。
説明内容は述語リファレンスの内容に準じます。
キーワードを指定した場合は、対応するユーザーズマニュアルの章を表示します。
キーワード一覧は、「(マニュアルの使い方)2-3.電子マニュアル呼び出し機能」を参照して下さい。
manual/0 の場合は マニュアルの目次を表示します。"; hash["reference"]=""; hash["sample"]="| ?-manual(write).

    →「write/1」「write/2」が表示されます。

| ?-manual(write/1).

    →「write/1」が表示されます。

| ?-manual(debugger).    <== キーワードは debugger です。

   →「6.デバッガ」の章が表示されます。"; hash["genre"]="31"; hash["used"]="false"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="60"; hash["name"]="get_parameter/1"; hash["common"]=""; hash["format"]="get_parameter(-L)"; hash["argument"]="L:コマンドラインパラメータ(アトム)のリスト"; hash["text"]="AZ-Prologインタープリタ起動時、又はスタンドアロンアプリケーション(コンパイルコード)起動時のコマンドラインパラメータをアトムのリストとして受取ります。
AZ-Prologインタープリタ起動時は「-p」オプション以降のパラメータが対象となり、スタンドアロンアプリケーション(コンパイルコード)はそのコンパイル時(AZPC 使用時)にコンパイラオプションの「/no」を指定した場合はコマンドラインパラメータの全てが対象となり、「/no」を指定しなかった場合はインタープリタ起動時と同様に「-p」オプション以降のパラメータが対象となります。"; hash["reference"]="「(操)3.3起動時のオプション」
"; hash["sample"]="[A:\\]prolog -h 30 -p 123 test.pl

| ?-get_parameter(L).
L = ['123','test.pl']
yes"; hash["genre"]="21"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="61"; hash["name"]="halt/0"; hash["common"]="ISO"; hash["format"]="halt"; hash["argument"]="なし"; hash["text"]="現在オープンされているファイルはすべてクローズした後、処理系を終了し制御をOSに戻します。"; hash["reference"]="「(操)3.2.1インタープリタの起動と終了」
"; hash["sample"]="| ?-halt.
Exit from Prolog

[A:\\]"; hash["genre"]="21"; hash["used"]="true"; hash["incident"]="halt/1
sh/0"; azlist.push(hash); var hash={}; hash["id"]="62"; hash["name"]="halt/1"; hash["common"]="ISO"; hash["format"]="halt(+I)"; hash["argument"]="I:終了条件の値を0~255の整数で指定
(32ビットの整数の下位8ビットを評価する)"; hash["text"]="現在オープンされているファイルはすべてクローズした後、処理系を終了し制御をOSに戻します。
halt/0 との違いは引数Iで終了条件(終了ステータス)を指定できる点だけです。
終了条件とはAZ-Prologを起動した親プロセスに返す値です。
例えばOS/2ではこの値をバッチファイル中でIFコマンドの条件文のERRORLEVELの値として受取らせる事が出来ます。"; hash["reference"]="「(操)3.2.1インタープリタの起動と終了」"; hash["sample"]="[A:]type az.cmd
echo off
cd az
prolog
if errorlevel 1 cd
というバッチファイルを考えてみると・・・
このバッチファイルは「az」というディレクトリにAZ-Prologがインストールされているとして、
まず「ルート」から「az」ディレクトリに移りAZ-Prologを立上げて、
halt(1) で終了すると、
「az」から「ルート」ディレクトリに戻し、
halt/1 引数にそれ以外の値を指定して終了すると、
「az」ディレクトリのままになるようになっています。

[A:]az
[A:]echo off
| ?-



| ?-halt(1).
Exit from Prolog

[A:] <== halt(1) で終了するとルートディレクトリに戻ります。



[A:]az
[A:]echo off



| ?-



| ?-halt(0). <== halt/1 の引数に1以外を指定して終了するとルートディレクトリに戻らず、
「az」ディレクトリのままになります。
Exit from Prolog
[A:AZ]



[A:AZ]az
[A:AZ]echo off



| ?-



| ?-halt. <== halt/0 で終了するとルートディレクトリに戻ります。
つまり、halt/0 は終了ステータス1を返します。(halt(1)と等価)
Exit from Prolog
[A:]"; hash["genre"]="21"; hash["used"]="true"; hash["incident"]="halt/0
sh/0"; azlist.push(hash); var hash={}; hash["id"]="63"; hash["name"]="s_reclaim/0"; hash["common"]=""; hash["format"]="s_reclaim"; hash["argument"]="なし"; hash["text"]="ヒープ領域及びグローバルスタックのガベージコレクション(GC:チリ集め)を強制的に行ないます。
例えば、ヒープ領域上の節をretractして削除しても実際にはマークが付けられるだけでメモリは開放されず未使用域になります。このため assert とretract を繰返すとヒープ領域に未使用域が隙間となって増えてしまうので有効利用範囲が狭くなってしまいます。そこでその隙間を詰め、未使用域を集めて、まとめて開放する必要が出てきます。この作業をガベージコレクション(GC:チリ集め)と呼ばれます。

通常、ガベージコレクションは自動的に行なわれます(Prologプログラムを実行中、突然訳もなく止ることがあるのはこの為です)。
しかし、どうしても途中で止っては困る処理もあります。
そんなときにこの述語をプログラム中に書いておき、止っては困る処理の前で実行しておくとしばらくは起こり難くなります(ただし、絶対起こらないという保証は有りません)。"; hash["reference"]=""; hash["sample"]=""; hash["genre"]="21"; hash["used"]="true"; hash["incident"]="s_greclaim/0
s_verbos/2
assert/1
assert/2
asserta/1
retract/1
retract/3
abolish/1
abolish/2
s_new/0
statistics/0
statistics/2
reset_statistics/0"; azlist.push(hash); var hash={}; hash["id"]="64"; hash["name"]="s_greclaim/0"; hash["common"]=""; hash["format"]="s_greclaim"; hash["argument"]="なし"; hash["text"]="グローバルスタックだけのガベージコレクタを強制的に起動します。
それ以外は s_reclaim/0 と同じです。"; hash["reference"]=""; hash["sample"]=""; hash["genre"]="21"; hash["used"]="true"; hash["incident"]="s_reclaim/0
s_verbos/2
assert/1
assert/2
asserta/1
retract/1
retract/3
abolish/1
abolish/2
s_new/0
statistics/0
statistics/2
reset_statistics/0"; azlist.push(hash); var hash={}; hash["id"]="65"; hash["name"]="s_verbos/2"; hash["common"]=""; hash["format"]="s_verbos(-A1,+A2)"; hash["argument"]="A1:変更前の状態が「on」か「off」でユニファイされる
A2:変更後の状態を「on」か「off」で指定する"; hash["text"]="ガベージコレクション(GC:チリ集め)が起こった時に、メッセージを表示するかどうかを「on」か「off」で切換えます。
表示させたい場合は「on」、表示させたくない場合は「off」を指定します。
ガベージコレクションの表示は主にデバッグ時に使います。"; hash["reference"]=""; hash["sample"]="| ?-s_verbos(_,on).
_ = off
yes
| ?-s_reclaim.
ENTERING GLOBAL GC.. 12345678 COLLECTED CELLS 10 USING 68
ENTERING HEAP GC ... 1234567 COLLECTED CELLS:852 USING:4142 LEFT:858
yes

この例では s_reclaim/0 をトップレベルで実行していますが通常は s_reclaim/0をトップレベルで実行してもあまり意味が有りません。"; hash["genre"]="21"; hash["used"]="true"; hash["incident"]="s_reclaim/0
s_greclaim/0"; azlist.push(hash); var hash={}; hash["id"]="66"; hash["name"]="statistics/0"; hash["common"]=""; hash["format"]="statistics"; hash["argument"]="なし"; hash["text"]="本処理系で使用している各種スタックなどの各領域の設定値(領域確保量)と現在の使用量を表示します。
ただし、ローカル・グローバル・トレイルの各スタックは現在の使用量ではなくて過去の最大使用量を表示します。
過去の最大使用量とはAZ-Prolog立上げ後か又は
reset_statistics/0実行後からの最大使用量です。
これを参考にして各領域の設定値を最小限に抑える事が出来る為、メモリの有効利用が可能です。
各領域の設定は、起動時のオプション(-a -h -l -g) に続くKセル単位の数値で指定できます。
また起動フォルダや環境変数AZPrologの場所にあるprolog.defファイルによっても指定可能です。

prolog.def ファイルは順番にatom、heap、Local、globalのKセル単位の数値をスペース区切りで記述します。
prolog.defの例(下記の実行例の設定値です):100 200 300 400"; hash["reference"]=""; hash["sample"]="| ?-statistics.

ATOM (cell) 102400 USED: 590
ARITY (cell) 102400 USED: 660
HEAP (cell) 204800 USED: 4772
LSTACK (cell) 306900 MAX: 53
GSTACK (cell) 409600  MAX: 1867
yes"; hash["genre"]="21"; hash["used"]="true"; hash["incident"]="reset_statistics/0
atommax/0
atomused/0
heapmax/0
heapused/0
localmax/0
localused/0
globalmax/0
globalused/0"; azlist.push(hash); var hash={}; hash["id"]="67"; hash["name"]="reset_statistics/0"; hash["common"]=""; hash["format"]="reset_statistics/0"; hash["argument"]="なし"; hash["text"]="statistics/0 でのローカル・グローバル・トレイルの各スタックの過去の最大使用量表示を初期化します。
ただし、インタープリタ自信の実行に必要な部分があるため初期化しても必ずしも0になるとは限りません。"; hash["reference"]=""; hash["sample"]="| ?-statistics.

ATOM (cell) 2048000 USED: 883
ARITY (cell) 2048000 USED: 836
HEAP (cell) 2097152 USED: 463
LSTACK (cell) 1048276 MAX: 159
GSTACK (cell) 2097152 MAX: 1062
yes
| ?-reset_statistics.
yes
| ?-statistics.

ATOM (cell) 2048000 USED: 883
ARITY (cell) 2048000 USED: 836
HEAP (cell) 2097152 USED: 463
LSTACK (cell) 1048276 MAX: 5 ローカル・グローバル・トレイルスタックの
GSTACK (cell) 2097152 MAX: 2 過去の最大使用量が減っている事が分る。
yes"; hash["genre"]="21"; hash["used"]="true"; hash["incident"]="statistics/0"; azlist.push(hash); var hash={}; hash["id"]="68"; hash["name"]="meter/1"; hash["common"]=""; hash["format"]="meter(?A)"; hash["argument"]="A : 変数現在の状態が返ります。
on メモリメータを表示します。
offメモリメータを消去します。"; hash["text"]="ヒープ、グローバルスタック、ローカルスタックの使用状況を自動的に表示します。
デバッグ時のスタック・ヒープの使用状況を監視するのに使います。

※OS/2版 のみサポートです。"; hash["reference"]=""; hash["sample"]=""; hash["genre"]="21"; hash["used"]="false"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="69"; hash["name"]="s_version/4"; hash["common"]=""; hash["format"]="s_version(-I,-A1,-A2,_)"; hash["argument"]="
I :AZ-Prologのバージョン
(整数表現する為、100倍されている)
A1 :使用OS名
A2 :国別情報(国名)
"; hash["text"]="AZ-Prologのバージョン・使用OS名・国別情報(国名)を取得します。
プログラム中でそれぞれの事情に合せた部分を作っておき、それらを実行時に自動的に分岐させたい場合などに使用します。"; hash["reference"]=""; hash["sample"]="| ?-s_version(AZ,OS,KU,_).
AZ = 730,
OS = Win64,
KU = JAPAN,
_3 = x64
yes"; hash["genre"]="21"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="70"; hash["name"]="error/1"; hash["common"]=""; hash["format"]="error(+I)"; hash["argument"]="I:エラー番号を指定する
(ただし、201以上は200を指定したと見なされる)"; hash["text"]="Iで指定したエラー番号のエラーを強制的に起こします。"; hash["reference"]="「(操)A.4エラーメッセージ一覧表」
"; hash["sample"]="| ?-error(1).
Syntax error ---- Backtrace
error(1) ?-
| ?-error(200).
user errors limit ---- Backtrace
error(200) ?-
| ?-error(1000).
user errors limit ---- Backtrace
error(1000) ?-"; hash["genre"]="22"; hash["used"]="true"; hash["incident"]="errormode/2
errorset/2"; azlist.push(hash); var hash={}; hash["id"]="71"; hash["name"]="errormode/2"; hash["common"]=""; hash["format"]="errormode(-I1,+I2)"; hash["argument"]="I1:変更前のエラーモードがユニファイされる
I2:変更後のエラーモードを指定する
ただし、エラーモードは 0,1,2,3 のいずれかの値である
それ以外の値を指定した場合はエラー(Illegal argument supplied)となる"; hash["text"]="エラーモードを変更します。
エラーモードとは何等かのエラーが起きた時の画面に出力される情報量を変化させるモードです。つまり、デバッグ時には出来るだけ多くの情報が要求され、反対にアプリケーション実行時には処理系からのメッセージによって画面が破壊されてしまうので出力されては困る場合もあります。
このように時と場合によってエラーに関する情報の量を変化させるのがエラーモードです。
それぞれのモードによって次の様な差が有ります。

0 何も出力しません。
1 エラーメッセージのみを出力します。
2 エラーメッセージを出力した上でバックトレースし、今まで実行された述語を遡って表示します。
3 デバッグモードの場合は、エラーメッセージを出力した上でバックトレースし、今まで実行された節を遡ってそのレベル数と共に表示します。ノーマルモードの場合は、2と同じです。"; hash["reference"]=""; hash["sample"]="| ?-errormode(_,0).
_0 = 2
yes
| ?-error(1).
| ?-errormode(_,1).
_0 = 0
yes
| ?-error(1).
syntax error
| ?-errormode(_,2).
_0 = 1
yes
| ?-error(1).
syntax error ---- Backtrace
error(1) ?-
| ?-errormode(_,3).
_0 = 2
yes
| ?-error(1).
syntax error ---- Backtrace
error(1) ?-
| ?-errormode(_,4).
Illegal argument supplied ---- Backtrace
errormode(3,4) ?-
| ?-"; hash["genre"]="22"; hash["used"]="true"; hash["incident"]="error/1
errorset/2"; azlist.push(hash); var hash={}; hash["id"]="72"; hash["name"]="errorset/2"; hash["common"]=""; hash["format"]="errorset(+C,-I・A)"; hash["argument"]="
C :ゴール、又はゴールの並びを「( )」で囲って指定する
I・A :Cの実行結果の「エラー番号」又は「succ」か「fail」がユニファイされる。
"; hash["text"]="Cで呼出された述語、又はそれ以下の述語の実行結果(「成功」「失敗」「エラー」)に関わらず成功し、その結果をI・Aにユニファイします。
通常、特に何等かの実行エラーが起こると、処理系はその実行を強制的に終了し、質問を発したコマンドレベルまで戻します。
しかし、アプリケーション実行時にこのような事が起こると都合が悪い事が多いと思われます。
そこで、この errorset/2 を使って述語をコールしておく(これを「トラップする」と言います)と、その述語、又はそれ以下の述語が例えエラーが起こっても、強制終了されず errorset/2 まで戻り、起こったエラーの番号が返されます。
エラーが起きなかった場合はその「成功」「失敗」によって「succ」か「fail」が返されます。
また、errormode を0にしておけば、全くアプリケーション利用者には気付かれずに処理できます。"; hash["reference"]=""; hash["sample"]="| ?-errormode(_,0).
_0 = 2
yes
| ?-errorset(error(1),X).
X = 1
yes
| ?-errorset(error(199),X).
X = 199
yes
| ?-errorset(true,X).
X = succ
yes
| ?-errorset(fail,X).
X = fail
yes
| ?-errorset(abort,X).
X = 255
yes
| ?-

この実行例は errorset/2 の動作を示しています。
通常はこの組込み述語をトップレベルで実行しても意味はありません。
"; hash["genre"]="22"; hash["used"]="true"; hash["incident"]="error/1
errormode/2"; azlist.push(hash); var hash={}; hash["id"]="73"; hash["name"]="s_mode/2"; hash["common"]=""; hash["format"]="s_mode(-A1,+A2)"; hash["argument"]="A1:変更前の状態を「on」か「off」でユニファイする
A2:変更後の状態を「on」か「off」で指定する"; hash["text"]="システムモードの「on」か「off」を指定します。
システムモードの「off」はユーザモードを意味します。"; hash["reference"]="「(操)5.11.2定義述語(システム述語とユーザ述語)」"; hash["sample"]="ヒープ領域のユーザ側に「8クィーンのプログラム」、
システム側に「エディタのプログラム」がそれぞれ入っているとすると・・・

?-listing.
q(N) :-
e_register(0,_,0),
queen(N,L),
e_register(0,N1,N1+1),
M is N1+1,
write('No.'),
write(M),
nl,
disp(L,N),
fail.
q(_) :-
e_register(0,N,N),
write('Total = '),
write(N).



yes
?-s_mode(_,on).
_ = off
yes
! ?-listing.
edit :-
e_cr_buf,
unknown(U,fail),
unknown(_,U),
e_cua,
e_dline(D),
e_init(D),
fileerrors(FE,fail),



yes
! ?-"; hash["genre"]="23"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="74"; hash["name"]="kanji_mode/2"; hash["common"]=""; hash["format"]="kanji_mode(-A1,+A2)"; hash["argument"]="A1:変更前の状態を「on」か「off」でユニファイする
A2:変更後の状態を「on」か「off」で指定する"; hash["text"]="漢字モードの「on」か「off」を指定します。
漢字モードとは一文字入出力述語や name/2 において、漢字などの多バイトコードをそのバイトをまとめて一つ数の数値として扱うか、1バイトづつ分けて複数の数値として扱うかを決定するモードです。
漢字モード「on」の時はそのバイト数をまとめて扱い、「off」の時1バイトづつ分けて扱います。
処理系立上げ時の初期値は「on」です。

通常は漢字モード「on」にしておけば問題ありませんが、Prolog-KABA上で動作していたPrologプログラムをAZ-Prolog上で動作させる時などは漢字モード「off」にしておいた方が都合のいい事もあります。"; hash["reference"]="「(操)5.8日本語処理と漢字モード」"; hash["sample"]="| ?-name(漢字,X).
X = [35519,36506]
yes
| ?-kanji_mode(_,off).
_ = on
yes
| ?-name(漢字,X).
X = [138,191,142,154]
yes"; hash["genre"]="23"; hash["used"]="true"; hash["incident"]="get/1
get/2
get0/1
get1/1
skip/1
name/2"; azlist.push(hash); var hash={}; hash["id"]="75"; hash["name"]="op/3"; hash["common"]="ISO"; hash["format"]="op(+I,+A1,+A2)"; hash["argument"]="
I :オペレータの結合の優先順位を表す整数値(0~1200)を指定する
A1 :オペレータの型を表すアトム(「xfx」「xfy」「yfx」「fx」「fy」「xf」「yf」のどれか)を指定する
A2 :オペレータ名を指定する
"; hash["text"]="A2をオペレータ名、結合の優先順位I、その型A1のオペレータを宣言します。"; hash["reference"]="「(操)4.4オペレータ」
"; hash["sample"]="| ?-op(500,xfy,と).
yes
| ?-read(X).
|: なす と きゅうり.
X = なす と きゅうり
yes"; hash["genre"]="23"; hash["used"]="true"; hash["incident"]="current_op/3"; azlist.push(hash); var hash={}; hash["id"]="76"; hash["name"]="debug/0"; hash["common"]=""; hash["format"]="debug"; hash["argument"]="なし"; hash["text"]="動作モードをデバッグモードにします。

<デバッグモードとは>
インタープリタ動作中(プログラム実行中)にゴールの実行の回数をカウントし、各ポイント毎にスパイのチェックを行なうモードです。
実行終了後トッフレベルに戻った時に述語をコールした回数の合計が表示されます。
ただし、デバッグモードではノーマルモードに比べて実行速度が落ちます。
(デバッグモードに対して普通の状態のことをノーマルモードと呼びます)

次の nodebug/0 でデバッグモードを解除し、ノーマルモードに戻ります。

なお、ノーマルモードにおいて trace/0 か spy /fy を実行すると自動的にデバッグ
モードに入ります。"; hash["reference"]="「(操)第6章デバッガ」
"; hash["sample"]="| ?-debug.
yes
debug mode on
||?-
LOOP = 1 <== ゴール(debug/0)が1回だけコールされた事を示す
|| ?- <== プロンプトが「|| ?-」に代って
デバッグモードに入った事を示す"; hash["genre"]="24"; hash["used"]="true"; hash["incident"]="nodebug/0
trace/0
notrace/0
spy /fy
nospy /fy
leash/1
leash1/1
debugging/0"; azlist.push(hash); var hash={}; hash["id"]="77"; hash["name"]="nodebug/0"; hash["common"]=""; hash["format"]="nodebug"; hash["argument"]="なし"; hash["text"]="デバッグモードを解除し、実行モードをノーマルモードに戻します。
この述語が実行されるとコンソ-ルに以下のようなメッセージが出力されます。
debug mode off
ただし、すでにデバッグモードでない場合にはこのメッセージは出力されません。
"; hash["reference"]="「(操)第6章デバッガ」
"; hash["sample"]=""; hash["genre"]="24"; hash["used"]="true"; hash["incident"]="debug/0
trace/0
notrace/0
spy /fy
nospy /fy
leash/1
leash1/1
debugging/0"; azlist.push(hash); var hash={}; hash["id"]="78"; hash["name"]="trace/0"; hash["common"]=""; hash["format"]="trace"; hash["argument"]="なし"; hash["text"]="現在の実行モードがノーマルモードの場合は先ずデバッグモードにした後、トレースモードに移行します。
トレースモードに移行すると、以降コールする全述語の「成功」「失敗」「エラー」等を画面に報告します。
また、それぞれの局面でプログラムの中断・強制終了・または強制的に成功させたり、失敗させたりする事も出来ます。
また、この述語をプログラム中に書いておくと、実行の途中からトレースする事も出来ます。
トレースモードは次の notrace/0 で解除出来ます。"; hash["reference"]="「(操)第6章デバッガ」
"; hash["sample"]="| ?-trace.
yes
debug mode on
||?-trace.
[1] 0 Try : trace ?
<< BUILTIN CALL >>
[1] 0 Succ : trace
yes
LOOP = 2
||?-q(8). <== 8クィーンのプログラムをトレースしてみる
[1] 0 Try : q(8) ?
Match : q(8) :-
e_register(0,__6,0),
queen(8,L_8),
e_register(0,N1_10,N1_10+1),
M_12 is N1_10+1,
write(No.),
write(M_12),
nl,
disp(L_8,8),
fail.
[2] 1 Try : e_register(0,__6,0) ?
<< BUILTIN CALL >>
[2] 1 Succ : e_register(0,92,0)
[2] 1 Try : queen(8,L_8) ?
Match : queen(8,L_8) :-
generate(8,L1_18),
put(L1_18,[],L_8).
[3] 2 Try : generate(8,L1_18) ?
Match : generate(8,[8|L_22]) :-
N1_24 is 8-1,
generate(N1_24,L_22).
[4] 3 Try : N1_24 is 8-1 ?
<< BUILTIN CALL >>
[4] 3 Succ : 7 is 8-1
<< LAST CALL >>
[3] 2 Try : generate(7,L_22) ?
Match : generate(7,[7|L_33]) :-
N1_35 is 7-1,
generate(N1_35,L_33).
[4] 3 Try : N1_35 is 7-1 ?
<< BUILTIN CALL >>
[4] 3 Succ : 6 is 7-1
<< LAST CALL >>
[3] 2 Try : generate(6,L_33) ?
Match : generate(6,[6|L_44]) :-
N1_46 is 6-1,
generate(N1_46,L_44).
[4] 3 Try : N1_46 is 6-1 ?
<< BUILTIN CALL >>
[4] 3 Succ : 5 is 6-1
<< LAST CALL >>
[3] 2 Try : generate(5,L_44) ?
Match : generate(5,[5|L_55]) :-
N1_57 is 5-1,
generate(N1_57,L_55).
[4] 3 Try : N1_57 is 5-1 ?
<< BUILTIN CALL >>
[4] 3 Succ : 4 is 5-1
<< LAST CALL >>
[3] 2 Try : generate(4,L_55) ?
Match : generate(4,[4|L_66]) :-
N1_68 is 4-1,
generate(N1_68,L_66).
[4] 3 Try : N1_68 is 4-1 ?
<< BUILTIN CALL >>
[4] 3 Succ : 3 is 4-1"; hash["genre"]="24"; hash["used"]="true"; hash["incident"]="debug/0
nodebug/0
notrace/0
spy /fy
nospy /fy
leash/1
leash1/1
unknown/2
debugging/0"; azlist.push(hash); var hash={}; hash["id"]="79"; hash["name"]="notrace/0"; hash["common"]=""; hash["format"]="notrace"; hash["argument"]="なし"; hash["text"]="トレースモードを解除し、トレースを中止します。
ただし、デバッグモードは解除されませんのでノーマルモードには戻りません。"; hash["reference"]=""; hash["sample"]="||?-notrace.
yes
LOOP = 1
||?-nodebug.
yes
debug mode off
| ?-"; hash["genre"]="24"; hash["used"]="true"; hash["incident"]="debug/0
nodebug/0
trace/0
spy /fy
nospy /fy
leash/1
leash1/1
unknown/2
debugging/0"; azlist.push(hash); var hash={}; hash["id"]="80"; hash["name"]="spy /fy"; hash["common"]=""; hash["format"]="spy +A・A/I・A/I1/I2・A/I1/I2/I3・L"; hash["argument"]="
A :「述語名」
A/I :「述語名/アリティ」
A/I1/I2 :「述語名/アリティ/節順位」
A/I1/I2/I3 :「述語名/アリティ/節順位/ボディ部のゴール順位」
L :上記を要素とし、カンマ区切りに並べる
"; hash["text"]="引数で指定される述語をスパイポイントとして設定します。
なお、ノーマルモードにおいてこの spy /fy を実行すると先ずデバッグモードに入ってからスパイポイントを設定します。
スパイとはある限定された述語のみか、又はそれ以降をトレースする機能です。
その述語をスパイポイントと呼びます。(スパイは、他言語プログラムにおいてデバッグ時によく使用されるブレークポイントに相当します)
また、当然ながら複数個の述語にスパイを同時にかけることもできます。

・引数が「述語名」の場合はその述語名を持つ述語すべてをスパイポイントとして設定します。
・引数が「述語名/アリテ」の場合はその述語名とアリティの述語をスパイポイントとして設定します。
・引数が「述語名/アリテ/節順位」の場合はその述語名とアリティの述語の指定された順位の節をスパイポイントとして設定します
・引数が「述語名/アリテ/節順位/節順位/ボディ部のゴール順位」の場合はその述語名とアリティの述語の指定された順位の節のゴール順位をスパイポイントとして設定します。
・引数が上記を要素とするリストの場合は、その個々の要素に対してスパイポイントを設定します。

もし引数で指定される述語が存在しなかった場合は無視します。その場合でも spy /fy 自身は成功します。
spy /fy は前置オペレータであることに注意して下さい。
nospy /fy でスパイポイントを解除出来ます。"; hash["reference"]=""; hash["sample"]="/* 例( spy +A ) */
| ?-[-'queen.pl']. <== queen.pl をコンサルト
yes
| ?-spy generate. <== 述語名generateに異なるアリティで複数の述語がある場合 ?-spy generate/3. で一意化可
yes
debug mode on
||?-queen(4,X).
[2] 1 Try : generate(4,L1_11) ? <== generate/3がTryされるところでトレース開始
Match : generate(4,[4|L_15]) :-
N1_17 is 4-1,
generate(N1_17,L_15).
[3] 2 Try : N1_17 is 4-1 ?
<< BUILTIN CALL >>
[3] 2 Succ : 3 is 4-1
<< LAST CALL >>
[2] 1 Try : generate(3,L_15) ?

|
|
|

[9] 4 Retry : put([],[2,4,1,3],X_5) ?
Match : put([],[2,4,1,3],[2,4,1,3]).
[9] 4 Succ : put([],[2,4,1,3],[2,4,1,3])
[7] 3 Succ : put([2],[4,1,3],[2,4,1,3])
[5] 2 Succ : put([4,2],[1,3],[2,4,1,3])
[3] 1 Succ : put([4,2,1],[3],[2,4,1,3])
[1] 0 Succ : put([4,3,2,1],[],[2,4,1,3])
X = [2,4,1,3]
yes
LOOP = 125"; hash["genre"]="24"; hash["used"]="true"; hash["incident"]="debug/0
nodebug/0
trace/0
notrace/0
nospy /fy
leash/1
leash1/1
unknown/2
debugging/0"; azlist.push(hash); var hash={}; hash["id"]="81"; hash["name"]="nospy /fy"; hash["common"]=""; hash["format"]="nospy +A・A/I・A/I1/I2・A/I1/I2/I3・L"; hash["argument"]="
A :「述語名」
A/I :「述語名/アリティ」
A/I1/I2 :「述語名/アリティ/節順位」
A/I1/I2/I3 :「述語名/アリティ/節順位/ボディ部のゴール順位」
L :上記を要素とし、カンマ区切りに並べる
"; hash["text"]="引数で指定される述語がスパイポイントに設定されていた場合、その設定を解除します。
・引数が「述語名」の場合はその述語名を持つ述語のどれかがスパイポイントとして設定されていた場合その設定を解除します。
・引数が「述語名/アリティ」の場合はその述語名とアリティの述語がスパイポイントとして設定されていた場合その設定を解除します。
・引数が「述語名/アリテ/節順位」の場合はその述語名とアリティの述語の指定された順位の節がスパイポイントとして設定されていた場合その設定を解除します。
・引数が「述語名/アリテ/節順位/節順位/ボディ部のゴール順位」の場合はその述語名とアリティの述語の指定された順位の節のゴール順位がスパイポイントとして設定されていた場合その設定を解除します。
・引数が上記をを要素とするリストの場合は、その個々の要素に対してスパイポイントを解除します。

ただし、この述語によって例えすべてのスパイポイントが解除されてもデバッグモードは解除されずノーマルモードには戻りません。

nodebug/0 が実行されると、スパイポイントも、そのすべてが解除されます。"; hash["reference"]="「(操)第6章デバッガ」
"; hash["sample"]="||?-nospy queen.
[1] 0 Try : nospy generate ?
<< BUILTIN CALL >>
[1] 0 Succ : nospy generate
yes
LOOP = 1
||?-queen(4,X).
X = [2,4,1,3]
yes"; hash["genre"]="24"; hash["used"]="true"; hash["incident"]="debug/0
nodebug/0
trace/0
notrace/0
spy /fy
leash/1
leash1/1
unknown/2
debugging/0"; azlist.push(hash); var hash={}; hash["id"]="82"; hash["name"]="leash/1"; hash["common"]=""; hash["format"]="leash(+I)"; hash["argument"]="
I :各局面を対応ビットで表した整数値を設定
どのビットがどの局面に対応しているかを下に示す
5 4 3 2 1 0
Retry Pop Fail Succ Match try

「対応ビットで表した整数値」とは2進数の対応した桁を1にした値。
例えば「Retry」と「Match」「try」の3つの局面に設定したい場合は「2'100011」
又は10進数表現で「35」を設定する。(実行例参照)
従って、すべての局面を設定したい場合は「2'111111」、
又は10進数表現で「63」を設定すればよい。

A :Version 8 からは、r,p,f,s,m,t を含むアトムによる設定を追加
r,p,f,s,m,tが Retry Pop Fail Succ Match tryに対応。順序は問わず、それ以外の文字は無視する。
?- leash(rfpt). <= retry,fail,pop,tryの意味 2'111001と同義
"; hash["text"]="トレース時にどの局面でコマンド入力を受け付けるかを変更します。
"; hash["reference"]=""; hash["sample"]="| ?-debugging.
<< DEBUGGING >>
Debug Mode = debug
Unknown = fail
Spy Points =
Command Point = Try Retry <== 「Command Point」のデフォルト。
Display Point = Try Match Succ Fail Pop Retry
Verbos Mode = middle
yes
LOOP = 1
| ?-leash(2'100011).
yes
LOOP = 1
| ?-debugging.
<< DEBUGGING >>
Debug Mode = debug
Unknown = fail
Spy Points =
Command Point = Try Match Retry <== 「Match」が追加されました。
Display Point = Try Match Succ Fail Pop Retry
Verbos Mode = middle
yes
LOOP = 1
| ?-"; hash["genre"]="24"; hash["used"]="true"; hash["incident"]="debug/0
nodebug/0
trace/0
notrace/0
spy /fy
nospy /fy
get_leash/1
leash1/1
unknown/2
debugging/0"; azlist.push(hash); var hash={}; hash["id"]="83"; hash["name"]="leash1/1"; hash["common"]=""; hash["format"]="leash1(+I)"; hash["argument"]="
I :各局面を対応ビットで表した整数値を設定
A :Version 8 からは、r,p,f,s,m,t を含むアトムによる設定を追加
r,p,f,s,m,tが Retry Pop Fail Succ Match tryに対応。順序は問わず、それ以外の文字は無視する。
?- leash(rfpt). <= retry,fail,pop,tryの意味 2'111001と同義
"; hash["text"]="トレース時及びスパイにおいてどの局面を表示するかを変更します。
引数の設定方法は、leash/1 と同じです。
"; hash["reference"]="「(操)第6章デバッガ」

"; hash["sample"]="| ?-debugging.
<< DEBUGGING >>
Debug Mode = debug
Unknown = fail
Spy Points =
Command Point = Try Retry
Display Point = Try Match Succ Fail Pop Retry <==「表示 Point」のデフォルト。
Verbos Mode = middle
yes
LOOP = 1
| ?-leash1(2'100011).
yes
LOOP = 1
| ?-debugging.
<< DEBUGGING >>
Debug Mode = debug
Unknown = fail
Spy Points =
Command Point = Try Retry
Display Point = Try Match Retry <==「Try」「Match」「Retry」に変更されました。
Verbos Mode = middle

yes
LOOP = 1
| ?-"; hash["genre"]="24"; hash["used"]="true"; hash["incident"]="debug/0
nodebug/0
trace/0
notrace/0
spy /fy
nospy /fy
leash/1
get_leash1/1
unknown/2
debugging/0"; azlist.push(hash); var hash={}; hash["id"]="84"; hash["name"]="unknown/2"; hash["common"]=""; hash["format"]="unknown(-A1,+A2)"; hash["argument"]="A1:変更前の状態が「trace」「fail」「error」のいずれかでユニファイされる
A2:変更後の状態を「trace」「fail」「error」のいずれかで指定する
"; hash["text"]="定義されていない述語を実行しようとしたときの処理モードを変更できる。
・ただ単にその述語は失敗する。「fail」
・トレースモードに移行する。「trace」
・エラーになる。「error」
の内どれにするかを変更します。初期値はfailです。"; hash["reference"]="「(操)第6章デバッガ」
trace/0 errorset/2
"; hash["sample"]="| ?-aaaa.
no
| ?-unknown(_,error).
_ = fail
yes
| ?-aaaa.
unknown predicate call ---- Backtrace
aaaa | ?-
| ?-"; hash["genre"]="24"; hash["used"]="true"; hash["incident"]="trace/0
errorset/2
"; azlist.push(hash); var hash={}; hash["id"]="85"; hash["name"]="debugging/0"; hash["common"]=""; hash["format"]="debugging"; hash["argument"]="なし"; hash["text"]="1) 現在デバッグモードか否か
2) 定義されていない述語を実行しようとしたとき、「失敗する」「トレースを始める」「エラーとなる」の内どの動作をするか
3) スパイがかかっている述語
4) トレース時にどの局面でコマンド入力を受け付けるか
5) トレース時及びスパイにおいてどの局面を表示するか
"; hash["reference"]="「(操)第6章デバッガ」
"; hash["sample"]="?-debugging.

<< DEBUGGING >>

Debug Mode = debug
Unknown = fail
Spy Points =
Command Point = Try Retry
Display Point = Try Match Succ Fail Pop Retry
Verbos Mode = middle
yes
?-"; hash["genre"]="24"; hash["used"]="true"; hash["incident"]="debug/0
nodebug/0
trace/0
notrace/0
spy /fy
nospy /fy
leash/1
leash1/1
unknown/2"; azlist.push(hash); var hash={}; hash["id"]="86"; hash["name"]="= /xfx"; hash["common"]="ISO"; hash["format"]="? T1 = ? T2"; hash["argument"]="T1,T2:任意の項"; hash["text"]="T1とT2をユニファイ(ユニフィケーション・単一化)します。
単純項のユニファイには次の3通りの場合があります。
・どちらか一方が未代入の変数で他方が実体を持つ項である時、未代入の変数に項
が代入されます。この場合は必ず成功します。
・双方が実体を持つ項である時、全く同じ項であれば成功し、そうでなければ失敗
します。(== /xfy と同じ)
・双方が未代入の変数である時、双方の変数の領域を共有します。
領域を共有するとは、その後ユニファイによってどちらかの変数に値が代入され
ると他方の変数にも同じ値が代入されるということです。

複合項のユニファイはファンクタとアリティが共に同じでなければ失敗し、同じな
らば引数のユニファイにかかり、全ての引数のユニファイが成功して初めてその複
合項のユニファイが成功します。

なお、本書の中で数多く使われている「ユニファイ」という言葉の意味はすべてこ
れと同じ意味です。"; hash["reference"]=""; hash["sample"]="| ?-X = aaa.
X = aaa
yes
| ?-1+2 = 1+2.
yes
| ?-X = Y,X = aaa.
X = aaa,
Y = aaa
yes
| ?-1+2 = 3.
no
| ?-1+2 = 2+1.
no
| ?-\"a\" = [97].
yes"; hash["genre"]="30"; hash["used"]="true"; hash["incident"]="== /xfx
"; azlist.push(hash); var hash={}; hash["id"]="87"; hash["name"]="e_switch/3"; hash["common"]=""; hash["format"]="e_switch(+N,-A1,+A2)"; hash["argument"]="
A1 :変更前の状態が「on」「off」のいずれかでユニファイされる
A2 :変更後の状態を「on」「off」のいずれかで指定する
「on」「off」以外を指定するとエラー(Illegal argument supplied)となる
"; hash["text"]="Nで指定された番号のフラグレジスタの値を取得・変更します。

AZ-Prolog起動直後の初期値は「off」ですが、当然ながら何等かのプログラムを走らせた後は値が変っている可能性がありますから、プログラム中で使用する場合は初期設定する必要があります。

なおこの他に整数を保存する整数レジスタ、実数を保存する実数レジスタ、アトムを保存するアトムレジスタがそれぞれ32個づつ用意されています。
"; hash["reference"]=""; hash["sample"]="| ?-e_switch(0,_,on).
_0 = off
yes
| ?-e_switch(0,X,X).
X = on
yes
| ?-"; hash["genre"]="30"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="88"; hash["name"]="e_register/3"; hash["common"]=""; hash["format"]="e_register(+N1,-I,+N2)"; hash["argument"]="
N1 :レジスタ番号を0~31の範囲内の値の数式で指定する
I :変更前の値がユニファイされる
N2 :変更後の値を指定する

数値以外を指定するとエラー(Illegal argument supplied)となる"; hash["text"]="N1で指定された番号の整数レジスタの値を取得・変更します。

AZ-Prolog起動直後の初期値は「0」ですが、当然ながら何等かのプログラムを走らせた後は値が変っている可能性がありますから、プログラム中で使用する場合は初期設定する必要があります。

なお、この他に「on」「off」の状態を保存するフラグレジスタ、実数を保存する実数レジスタ、アトムを保存するアトムレジスタがそれぞれ32個づつ用意されています。"; hash["reference"]=""; hash["sample"]="| ?-e_register(0,_,123).
_ = 0
yes
| ?-e_register(0,X,X).
X = 123
yes"; hash["genre"]="30"; hash["used"]="true"; hash["incident"]="e_switch/3
f_register/3
a_register/3"; azlist.push(hash); var hash={}; hash["id"]="89"; hash["name"]="f_register/3"; hash["common"]=""; hash["format"]="f_egister(+N1,-F,+N2)"; hash["argument"]="
N1 :レジスタ番号を0~31の範囲内の値の数式で指定する
F :変更前の値がユニファイされる
N2 :変更後の値を指定する
"; hash["text"]="N1で指定された番号の実数レジスタの値を取得・変更します。
例えN2に整数値を指定しても「.00000」が付いた実数が保存されます。

AZ-Prolog起動直後の初期値は「0.00000」ですが、当然ながら何等かのプログラムを走らせた後は値が変っている可能性がありますから、プログラム中で使用する場合は初期設定する必要があります。

なお、この他に「on」「off」の状態を保存するフラグレジスタ、整数を保存する整数レジスタ、実数を保存する実数レジスタ、アトムを保存するアトムレジスタがそれぞれ32個づつ用意されています。
"; hash["reference"]=""; hash["sample"]="| ?-f_register(0,_,1.23).
_ = 0.000000000000000
yes
| ?-f_register(0,X,X).
X = 1.23000000000000
yes
"; hash["genre"]="30"; hash["used"]="true"; hash["incident"]="e_switch/3
e_register/3
a_register/3"; azlist.push(hash); var hash={}; hash["id"]="90"; hash["name"]="a_register/3"; hash["common"]=""; hash["format"]="a_register(+N,-A1,+A2)"; hash["argument"]="
N :レジスタ番号を0~31の範囲内の値の数式で指定する
A1 :変更前の値がユニファイされる
A2 :変更後の値を指定する

アトム以外を指定するとエラー(Illegal argument supplied)となる"; hash["text"]="Nで指定された番号のレジスタの値を取得・変更します。

AZ-Prolog起動直後の初期値は「[]」ですが、当然ながら何等かのプログラムを走らせた後は値が変っている可能性がありますから、プログラム中で使用する場合は初期設定する必要があります。

なお、この他に「on」「off」の状態を保存するフラグレジスタ、整数を保存する整数レジスタ、実数を保存する実数レジスタ、アトムを保存するアトムレジスタがそれぞれ32個づつ用意されています。"; hash["reference"]=""; hash["sample"]="| ?-a_register(0,_,abc).
_ = []
yes
| ?-a_register(0,X,X).
X = abc
yes
"; hash["genre"]="30"; hash["used"]="true"; hash["incident"]="e_switch/3
e_register/3
f_register/3"; azlist.push(hash); var hash={}; hash["id"]="91"; hash["name"]="s_atom/2"; hash["common"]=""; hash["format"]="s_atom(?A,?I)"; hash["argument"]="
A: アトムを指定、又はユニファイされる
I: アトム番号を整数で指定、又はユニファイされるこれら以外を指定した場合はエラー(Illegal argument supplied)となる
"; hash["text"]="アトムからそのアトム番号、アトム番号から該当のアトムを相互に取得します。
なお、アトム番号からアトムを取得しようとした場合に該当のアトムがなければこの述語は失敗します。

この述語は「HELPメンテナンスユーティリティ」で使用しています。
"; hash["reference"]=""; hash["sample"]="| ?-s_atom(end_of_file,X).
X = 32
yes
| ?-s_atom(X,61).
X = breaklevel
yes
"; hash["genre"]="30"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="92"; hash["name"]="current_atom/1"; hash["common"]=""; hash["format"]="current_atom(-A)"; hash["argument"]="A:現在、ヒープ領域に登録されているアトムがユニファイされる"; hash["text"]="現在、ヒープ領域に存在するアトムを一つずつ取ってきてAにユニファイします。
この述語は非決定性ですからバックトラックによって後戻りしてきたら次のアトムをAにユニファイします。
これを繰返すと全てのアトムを取ってくることができます。"; hash["reference"]=""; hash["sample"]="| ?-current_atom(X).
X = [];
X = +;
X = -;
X = *;
X = /;
X = :-;
X = .;
X = ,;
X = ;;
X = ->;
X = succ;"; hash["genre"]="30"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="93"; hash["name"]="current_op/3"; hash["common"]="ISO"; hash["format"]="current_op(?I,?A1,?A2)"; hash["argument"]="
I :A2のオペレータの結合の優先順位がユニファイされる
A1 :A2のオペレータの型がユニファイされる
A2 :現在、宣言されているオペレータがユニファイされる
"; hash["text"]="現在、宣言されているオペレータのその結合の優先順位と型とを一つずつ取ってきて、それぞれの引数にユニファイします。
この述語は非決定性ですからバックトラックによって後戻りしてきたら次のオペレータをユニファイし、これを繰返すと全てのオペレータを取ってくることができます。"; hash["reference"]=""; hash["sample"]="| ?-current_op(N,K,O).
N = 1200,
K = fx,
O = :-;
N = 1200,
K = xfx,
O = :-;
N = 1200,
O = ?-;
N = 900,
K = fy,
O = \+,
yes
| ?-"; hash["genre"]="30"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="94"; hash["name"]="current_pred/2"; hash["common"]=""; hash["format"]="current_pred(?A,?I), current_predicate(?A/I)"; hash["argument"]="A:述語の述語名がユニファイされる
I:述語のアリティがユニファイされる"; hash["text"]="現在、登録されている述語のその述語名とアリティを一つずつ取ってきて、それぞれの引数にユニファイします。
この述語は非決定性ですから、バックトラックによって後戻りしてきたら次の述語をユニファイし、これを繰返すと全ての述語を取ってくることができます。
ISOのcurrent_predicate/1と同じです。"; hash["reference"]=""; hash["sample"]="| ?-current_pred(F,N).
F = ;,
N = 2;
F = ->,
N = 2;
F = call,
N = 1;
F = log,
N = 0;
F = log,
N = 1;
F = edit,
N = 0;
F = edit,
N = 1;
F = error,
N = 1;
F = fail,
N = 0;

| ?-current_predicate(F/N).
F = !,
N = 0
yes
"; hash["genre"]="30"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="95"; hash["name"]="s_random/2"; hash["common"]=""; hash["format"]="s_random(+N,-I)"; hash["argument"]="N:乱数の上限を指定する
I:発生した乱数がユニファイされる"; hash["text"]="0からN-1を上限とする疑似乱数を発生し、Iにユニファイします。"; hash["reference"]="s_randomize/2"; hash["sample"]="| ?-repeat,s_random(10,X),write(X),put(32),fail.
1 9 1 6 7 6 3 7 1 2 7 9 4 7 1 8 2 4 8 8 1 6 2 0 4 8 5 9 4 4 4 9 9 4 5 3 2 1
7 4 3 1 9 0 7 3 8 4 2 6 9 8 7 7 4 8 7 8 3 2 1 9 3 7 4 4 4 3 5 1 3 2 8 0 9 0
3 4 9 4 4 3 9 8 5 3 8 1 2 3 8 9 8 5 1 0 6 1 8 1 8 7 7 2 8 2 3 6 6 9 6 5 1 3
8 0 7 6 1 6 0 3 1 0 4 3 1 5 8 9 5 4 5 7 4 4 6 7 7 5 2 6 8 8 9 1 9 8 0 5 0 2
9 6 0 2 2 9 2 6 7 3 6 0 5 2 1 7 1 1 5 3 2 6 6 8 1 5 8 6 9 4 6 6 2 8 8 1 6 8
7 8 9 7 9 0 5 8 2 6 9 7 1 7 5 1 6 4 4 9 9 6 1 5 5 6 0 7 5 0 7 9 5 6 8 5 3 7
0 7 5 2 3 0 4 9 8 5 8 0 0 9 7 7 4 4 7 5 9 2 3 2 2 3 1 9 7 3 0 4 3 7 8 0 8 8
1 2 7 4 9 1 9 3 6 2 0 7 2 0 0 5 3 5 7 7 4 4 3 3 8 6 4 4 5 9 2 4 4 2 4 2 5 3
2 3 4 0 2 3 7 2 0 7 7 6 1 7 5 6 7 9 0 8 5 7 4 2 5 6 5 8 8 2 8 5 2 7 6 7 3 3
5 6 9 4 4 5 9 6 9 2 9 5 6 1 7 8 3 7 2 6 9 1 0 0 4 5 6 3 6 4 6 7 6 3 9 1 4 7
5 0 0 5 5 8 8 6 9 8 1 5 6 0 6 0 4 7 8 6 4 0 3 4 1 0 0 4 3 6 1 0 5 6 8 6 7 6
7 8 9 4 5 1 0 2 8 6 7 0 7 7 4 6 2 2 9 6 5 6 4 0 6 9 6 2 9 1 2 6 4 7 0 8 2 4
1 0 0 3 6 1 7 9 8 0 2 9 8 9 7 4 7 7 5 3 9 1 2 9 6 1 1 4 9 8 6 9 7 4 8 2 5 8
2 5 6 1 9 3 7 1 3 2 0 6 8 9 9 3 9 1 1 3 4 8 2 4 9 1 4 3 9 4 9 5 2 1 6 7 2 5
1 8 0 7 5 7 4 2 9 1 8 4 4 8 1 2 8 4 6 7 3 1 5 8 5 4 2 6 6 4 6 1 4 0 4 6 6 7
5 8 1 1 5 1 1 9 0 7 6 3 4 4 5 7 2 6 5 6 2 9 6 5 3 2 1 6 3 4 9 0 5 6 5 0 6 5
3 3 2 6 6 0 6 2 0 0 5 2 0 5 6 1 0 4 9 4 0 2 6 6 4 0 7 2 6 6 8 5 1 0 0 2 1 3
8 4 3 5 0 8 7 0 5 3 5 6 3 0 2 9 9 3 7 9 3 9 3 0 2 5 1 1 8 3 3 7 4 6 7 1 9 4
INTERRUPT<== [中断キー] を押しました。
Interrepting A(bort),B(reak),C(ontinue),O(s level),N(odebug) or T(race) ?a
| ?-"; hash["genre"]="30"; hash["used"]="true"; hash["incident"]="s_randomize/2"; azlist.push(hash); var hash={}; hash["id"]="96"; hash["name"]="e_edit/2"; hash["common"]=""; hash["format"]="e_edit(-I,+N)"; hash["argument"]="
I :変更前のバッファ番号がユニファイされる
N :変更後のバッファ番号を0~7の範囲内の値の数式で指定する
実数を指定した場合は小数点以下が切捨てられる
範囲外の数値を指定すると失敗する
"; hash["text"]="まずNに現在のバッファ番号をユニファイした後、現在のバッファ番号をNで指定された番号に変更します。

この述語は現在のバッファ番号を変更するだけのもので、実際に領域が確保されていないバッファでも指定できますし、またその場合でも自ら領域確保はしません。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="97"; hash["name"]="e_end/0"; hash["common"]=""; hash["format"]="e_end"; hash["argument"]="なし"; hash["text"]="e_initによって禁止されたキーボードからの[中断キー(CTRL-S と CTRL-Q)]による割込みを許可し、逆にCTRL-G による割込みを禁止します。
AzEdit を終了する時には、必ず呼ぶ必要があります。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="98"; hash["name"]="e_free/0"; hash["common"]=""; hash["format"]="e_free"; hash["argument"]="なし"; hash["text"]="現在のバッファ番号のバッファが e_create/1 によって領域が確保されていれば、その領域を開放します。
もし確保されていなければ何もせずに失敗します。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="99"; hash["name"]="e_bell/2"; hash["common"]=""; hash["format"]=""; hash["argument"]=""; hash["text"]="ダブり削除"; hash["reference"]=""; hash["sample"]=""; hash["genre"]=""; hash["used"]="false"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="100"; hash["name"]="e_bothcase/2"; hash["common"]=""; hash["format"]="e_bothcase(-A1,+A2)"; hash["argument"]="
A1 :変更前の状態が「on」「off」のいずれかでユニファイされる
A2 :変更後の状態を「on」「off」のいずれかで指定する
「on」「off」以外を指定するとエラー(Illegal argument supplied)となる
"; hash["text"]="e_fsearch/1 と e_bsearch/1 による探索において英字の大小を区別するかどうかを設定します。
「on」の状態で区別せず、「off」で区別を行います。
Prologが起動されたときのデフォルト値は「on」です。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="101"; hash["name"]="e_change/2"; hash["common"]=""; hash["format"]="e_change(-A1,+A2)"; hash["argument"]="
A1 :変更前の状態が「on」「off」のいずれかでユニファイされる
A2 :変更後の状態を「on」「off」のいずれかで指定する
「on」「off」以外を指定するとエラー(Illegal argument supplied)となる
"; hash["text"]="「on」「off」状態を保存します。
e_switch/3と同じ様にフラグとして使用できます。
Prolog-KABAの初期のバージョンで使われていた述語で、Prolog-KABA後期バージョンでは当初の機能は無くなったのですが述語は残ったため、ユーザが単にフラグとして使用している事が考えられ、その互換のためにAZ-Prologでも残されました。"; hash["reference"]="e_switch/3"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="102"; hash["name"]="e_forward/1"; hash["common"]=""; hash["format"]="e_forward(+N) {^G}"; hash["argument"]="N:ドットを前方に進める文字数を指定"; hash["text"]="Nの文字数分だけドットを前方に進めます。
ドットがバッファの最後にあったり、バッファの最後を越えて進めようとした場合は失敗します。

なお、この述語を実行しただけではドットが移動するだけで画面のカーソルは移動しません。(つまり、画面のカーソルとドットがずれる事になります)
画面のカーソルを移動するには e_disp/0 を実行して画面を更新する必要があります。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="103"; hash["name"]="e_backward/1"; hash["common"]=""; hash["format"]="e_backward(+N) {^G}"; hash["argument"]="N:後戻りしたい文字数を指定
"; hash["text"]="Nの字数の分だけドットを後方に戻します。
ドットが既にバッファの先頭にあったり、バッファの先頭を越えて戻そうとした場合には、述語は失敗します。

なお、この述語を実行しただけではドット(バッファポインタ)が移動するだけで画面のカーソルは移動しません。(つまり、画面のカーソルとドットがずれる事になります)
画面のカーソルを移動するには e_disp/0 を実行して画面を更新する必要があります。"; hash["reference"]=""; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="104"; hash["name"]="e_up/1"; hash["common"]=""; hash["format"]="e_up(+N) {^G}"; hash["argument"]="N:桁位置(行の先頭からの文字数)を指定する
"; hash["text"]="ドットを一つ上(後方)の物理行のNで指定される桁位置に移動させます。

e_up(0)で一つ上の行の先頭(画面の左端)に移動します。
また、その行にNで示されただけの文字がなかった場合にはその行の最後に移動します。
更に、ドットがバッファの先頭行にある時には述語は失敗します。
なお、この述語を実行しただけではドットが移動するだけで画面中のカーソルの位置は変化しません。
実行結果を画面に反映するには e_disp/0 を実行して画面を更新する必要があります。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
e_disp/0"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="105"; hash["name"]="e_down/1"; hash["common"]=""; hash["format"]="e_down(+N) {^G}"; hash["argument"]="N:桁位置(行の先頭からの文字数)を指定する"; hash["text"]="ドットを一つ下(前方)の物理行のNで指定される桁位置に移動させます。
e_down(0) で一つ下の行の先頭(画面の左端)に移動します。
また、その行にNで示されただけの文字がなかった場合にはその行の最後に移動します。
更に、ドットが最終行にある時には述語は失敗します。
なお、この述語を実行しただけではドットが移動するだけで画面中のカーソルの位置は変化しません。
実行結果を画面に反映するには e_disp/0 を実行して画面を更新する必要があります。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="106"; hash["name"]="e_next/0"; hash["common"]=""; hash["format"]="e_next{^G}"; hash["argument"]="なし
"; hash["text"]="次の画面が表示されるようになるまでドットを前方に進めます。
なお、この述語を実行してもドットが移動するだけで画面表示は変化しません。
実行結果を画面に反映するには e_disp/0 を実行して画面を更新する必要があります。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="107"; hash["name"]="e_previous/0"; hash["common"]=""; hash["format"]="e_previous{^G}"; hash["argument"]="なし
"; hash["text"]="一つ後方の画面が表示されるようになるまでドットを後方に戻します。
なお、この述語を実行してもドットが移動するだけで画面表示は変化しません。
実行結果を画面に反映するには e_disp/0 を実行して画面を更新する必要があります。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」

"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="108"; hash["name"]="e_jump/1"; hash["common"]=""; hash["format"]="e_jump(+N) {^G}"; hash["argument"]="N:バッファ内の位置をその先頭からの文字数で指定する
"; hash["text"]="Nで示される位置にドットを移動させます。
ここで、位置はバッファの先頭からそこまでの文字数で表されます。
なお、この述語を実行してもドットが移動するだけで画面表示は変化しません。
実行結果を画面に反映するには e_disp/0 を実行して画面を更新する必要があります。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]="バッファの先頭にドットを移動させるには
e_jump(0)

バッファの最後に移動させるには
e_eob(P),e_jump(P)

とします。
"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="109"; hash["name"]="e_mark/0"; hash["common"]=""; hash["format"]="e_mark{^G}"; hash["argument"]="なし
"; hash["text"]="現在のドットの位置にマークが付けられます。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="110"; hash["name"]="e_markend/0"; hash["common"]=""; hash["format"]="e_markend"; hash["argument"]="なし
"; hash["text"]="バッファの最後の位置にマークを付けます。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="111"; hash["name"]="e_insert/1"; hash["common"]=""; hash["format"]="e_insert(+N・L) {^G}"; hash["argument"]="N・L:文字コード(数式)、又はそのリスト(ストリング)を指定する"; hash["text"]="文字又は文字列をバッファ中のドット位置の直後に挿入し、ドットを一つ又は文字列の文字数分だけ前方に進めます。

なお、この述語を実行しただけでは文字がバッファに挿入されるだけで画面表示は変化しません。
実行結果を画面に反映するには e_disp/0 を実行して画面を更新する必要があります。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="112"; hash["name"]="e_char/1"; hash["common"]=""; hash["format"]="e_char(-I) {^G}"; hash["argument"]="I:ドットの直後の文字コードがユニファイされる"; hash["text"]="ドットの次にある文字の文字コードをIにユニファイします。
なお、ドットがバッファの最後にある場合には失敗します。"; hash["reference"]=""; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="113"; hash["name"]="e_consult/0"; hash["common"]=""; hash["format"]="e_consult"; hash["argument"]="なし"; hash["text"]="ドットからバッファの前方に向かってマークまでのテキストを consult し、ドットはマークの位置に移動します。
既にドットがマークの後ろにある場合には何もしません。
なお、consult 中に「Syntax Error」が起きた時には、consult を中止してドットをエラーの位置に移動します。"; hash["reference"]=""; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="114"; hash["name"]="e_reconsult/0"; hash["common"]=""; hash["format"]="e_reconsult"; hash["argument"]="なし"; hash["text"]="ドットから前方に向かってマークまでのテキストを reconsult し、ドットはマークの位置に移動します。
既にドットがマークの後ろにある場合には何もしません。
なお reconsult 中に「Syntax Error」が起きた時には、reconsult を中止してドットをエラーの位置に移動します。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="115"; hash["name"]="e_delete/1"; hash["common"]=""; hash["format"]="e_delete(+N) {^G}"; hash["argument"]="N:削除したい文字数を指定する"; hash["text"]="ドットの直後から前方に向ってNで指定された数だけの文字をバッファから削除します。
バッファ中でドットの前方にある文字数より多く削除しようとした場合には、述語は失敗し、バッファは変更されません。

なお、この述語を実行しただけでは文字がバッファから削除されるだけで画面表示は変化しません。
実行結果を画面に反映するには e_disp/0 を実行して画面を更新する必要があります。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="116"; hash["name"]="e_new/0"; hash["common"]=""; hash["format"]="e_new"; hash["argument"]="なし"; hash["text"]="現在のバッファおよびキルバッファをクリア(空に)します。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="117"; hash["name"]="e_yank/0"; hash["common"]=""; hash["format"]="e_yank"; hash["argument"]="なし"; hash["text"]="キルバッファの内容をドットの前に挿入し、ドットを挿入した文字列の直後に移動させます。
この述語を実行してもキルバッファ内容は変化しません。
従って、同じ文字列を何回でも挿入できます。

なお、この述語を実行するとバッファ内容は変化しますが、画面表示は変化しません。

実行結果を画面に反映するには e_disp/0 を実行して画面を更新する必要があります。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="118"; hash["name"]="e_kill/1"; hash["common"]=""; hash["format"]="e_kill(+N) {^G}"; hash["argument"]="N:文字数を指定する"; hash["text"]="ドットの直後から後方に向ってNで指定された数の文字がキルバッファにコピーされ付け加えられます。
ドットの位置およびバッファは変更されません。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="119"; hash["name"]="e_kill/0"; hash["common"]=""; hash["format"]="e_kill{^G}"; hash["argument"]="なし"; hash["text"]="キルバッファをクリアします。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="120"; hash["name"]="e_bob/0"; hash["common"]=""; hash["format"]="e_bob {^G}"; hash["argument"]="なし"; hash["text"]="ドットがバッファの先頭にある場合に成功し、それ以外のときには失敗します。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="121"; hash["name"]="e_eob/0"; hash["common"]=""; hash["format"]="e_eob {^G}"; hash["argument"]="なし"; hash["text"]="ドットがバッファの最後にある場合に成功し、それ以外のときには失敗します。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="122"; hash["name"]="e_bol/0"; hash["common"]=""; hash["format"]="e_bol {^G}"; hash["argument"]="なし"; hash["text"]="ドットが行の先頭にある場合に成功し、それ以外のときには失敗します。
行の先頭かどうかは、バッファの先頭であるか、あるいはドットの前の文字が「NL」かどうかによって判断されます。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="123"; hash["name"]="e_eol/0"; hash["common"]=""; hash["format"]="e_eol {^G}"; hash["argument"]="なし"; hash["text"]="ドットが行の最後にある場合に成功し、それ以外のときには失敗します。
行の最後かどうかは、バッファの最後であるか、あるいはドットの後ろの文字が NLかどうかによって判断しています。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="124"; hash["name"]="e_pos/1"; hash["common"]=""; hash["format"]="e_pos(-I) {^G}"; hash["argument"]="I:ドット位置がユニファイされる"; hash["text"]="現在のドット位置(バッファの先頭からドットまでの文字数)をIにユニファイします。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="125"; hash["name"]="e_eob/1"; hash["common"]=""; hash["format"]="e_eob(-I) {^G}"; hash["argument"]="I:バッファ最終文字位置(現在のバッファに格納されている文字数)がユニファイされる"; hash["text"]="バッファ最終文字位置(現在のバッファに格納されている文字数)をIにユニファイします。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="126"; hash["name"]="e_bol/1"; hash["common"]=""; hash["format"]="e_bol(-I){^G}"; hash["argument"]="I:現在のドットがある行の先頭の位置がユニファイされる"; hash["text"]="現在のドットがある行の先頭の位置(バッファの先頭からその位置までの文字数)をIにユニファイします。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]=" AzEdit のCTRL-Aを行う本体は、次の様になります。
e_bol(Position),e_jump(Position)
"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="127"; hash["name"]="e_eol/1"; hash["common"]=""; hash["format"]="e_eol(-I) {^G}"; hash["argument"]="I:ドットがある行の最後の文字の位置がユニファイされる"; hash["text"]="現在、ドットがある行の文字数をユニファイします。
ここでいう行とは画面の物理行ではなく、前行の NL の次の文字(又はバッファの先頭)から NL までの論理行を意味します。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="128"; hash["name"]="e_mark/1"; hash["common"]=""; hash["format"]="e_mark(-I){^G}"; hash["argument"]="I:マーク位置がユニファイされる"; hash["text"]="マークの現在位置をIにユニファイします。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]="マークの位置へのドットの移動は
e_mark(Ps),e_jump(Ps)
で行うことができます。"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="129"; hash["name"]="e_alpha/1"; hash["common"]=""; hash["format"]="e_alpha(+N)"; hash["argument"]="N:調べたい一文字の文字コードを指定する"; hash["text"]="Nが英字を表すキャラクターコードであった場合には成功し、それ以外の場合に失敗します。"; hash["reference"]=""; hash["sample"]="| ?-e_alpha(97). <== 97は英字の「a」を表すキャラクターコードなので成功。
yes
| ?-e_alpha(47). <== 47は数字の「1」を表すキャラクターコードなので失敗。
no"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="130"; hash["name"]="e_lower/1"; hash["common"]=""; hash["format"]="e_lower(+N)"; hash["argument"]="N:調べたい一文字の文字コードを指定する"; hash["text"]="Nが半角英小文字(1バイト文字)の文字コードならば成功し、それ以外ならば失敗します。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]="| ?-e_lower(97). <== "a"を表す文字コード
yes
| ?-e_lower("a").
yes
| ?-e_lower("イ").
no"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="131"; hash["name"]="e_upper/1"; hash["common"]=""; hash["format"]="e_upper(+N)"; hash["argument"]="N:調べたい一文字の文字コードを指定する"; hash["text"]="Nが半角英大文字(1バイト文字)の文字コードならば成功し、それ以外ならば失敗します。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]="| ?-e_upper(65). <== "A"を表す文字コード
yes
| ?-e_upper("A").
yes
| ?-e_upper("a").
no"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="132"; hash["name"]="e_digit/1"; hash["common"]=""; hash["format"]="e_digit(+N)"; hash["argument"]="N:調べたい文字のキャラクタコード"; hash["text"]="Nが数字を表すキャラクタコードであった場合には成功し、そうでない場合に失敗します。"; hash["reference"]=""; hash["sample"]="| ?-e_digit(48). <== "A"を表す文字コード
yes
| ?-e_digit("1").
yes
"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="133"; hash["name"]="e_kana/1"; hash["common"]=""; hash["format"]="e_kana(+N)"; hash["argument"]="N:調べたい一文字の文字コードを指定する"; hash["text"]="Nが半角文字(1バイトコード文字)の文字コードならば成功し、それ以外ならば失敗します。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]="| ?-e_kana(178). <== "イ"を表す文字コード
yes
| ?-e_kana("イ").
yes
| ?-e_kana("a").
no"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="134"; hash["name"]="e_kanji/1"; hash["common"]=""; hash["format"]="e_kanji(+N)"; hash["argument"]="N:調べたい一文字の文字コードを指定する"; hash["text"]="Nが漢字などの多バイト文字の文字コードならば成功し、それ以外ならば失敗します。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]="| ?-e_kanji(35519). <== "漢"を表す文字コード
yes
| ?-e_kanji("漢").
yes
| ?-e_kanji("a").
no
"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="135"; hash["name"]="e_kanji1/1"; hash["common"]=""; hash["format"]="e_kanji1(+N)"; hash["argument"]="N:調べたい一文字の文字コードを指定する"; hash["text"]="Nが漢字などの多バイト文字の文字コードの第1バイト目ならば(可能性があれば)成功し、それ以外ならば失敗します。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]="| ?-e_kanji(0'8ABF). <== "漢"を表す文字コード
yes
| ?-e_kanji1(0'8A).
yes
| ?-e_kanji1(0'BF).
no
"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="136"; hash["name"]="e_kanji2/1"; hash["common"]=""; hash["format"]="e_kanji2(+N)"; hash["argument"]="N:調べたい一文字の文字コードを指定する"; hash["text"]="Nが漢字などの多バイト文字の文字コードの第2バイト目以降ならば(可能性があれば)成功し、それ以外ならば失敗します。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]="| ?-e_kanji(0'8ABF). <== "漢"を表す文字コード
yes
| ?-e_kanji2(0'8A).
yes
| ?-e_kanji2(0'BF).
yes"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="137"; hash["name"]="e_space/1"; hash["common"]=""; hash["format"]="e_space(+N)"; hash["argument"]="N:調べたい一文字の文字コードを指定する"; hash["text"]="Nがコントロールコードか半角(1バイトコード文字)の空白文字の文字コード(32以下)ならば成功し、それ以外ならば失敗します。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]="| ?-e_space(32). <== " "を表す文字コード
no
| ?-e_space(13).
yes
| ?-e_space("a").
no
"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="138"; hash["name"]="e_lower/2"; hash["common"]=""; hash["format"]="e_lower(+N,-I)"; hash["argument"]="N:一文字の文字コードを指定する
I:文字コードがユニファイされる"; hash["text"]="Nが英大文字を表す文字コードの場合には、小文字に変換してその文字コードをIにユニファイします。
それ以外の場合には、Nの文字コードをそのままIにユニファイします。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]="| ?-e_lower("A",X).
X = 97 <== "a"を表す文字コード
yes
| ?-e_lower("a",X).
X = 97 <== "a"を表す文字コード
yes
"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="139"; hash["name"]="e_upper/2"; hash["common"]=""; hash["format"]="e_upper(+N,-I)"; hash["argument"]="N:一文字の文字コードを指定する
I:文字コードがユニファイされる"; hash["text"]="Nが英大文字を表す文字コードの場合には、小文字に変換してその文字コードをIにユニファイします。
それ以外の場合には、Nの文字コードをそのままIにユニファイします。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]="| ?-e_upper("a",X).
X = 65 <== "A"を表す文字コード
yes
| ?-e_upper("A",X).
X = 65 <== "A"を表す文字コード
yes
"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="140"; hash["name"]="e_fsearch/1"; hash["common"]=""; hash["format"]="e_fsearch(+L){^G}"; hash["argument"]="L:検索する文字列の文字コードのリスト(ストリング)を指定する"; hash["text"]="ストリング(文字コードのリスト)からなる文字列を与えられると、その文字列と一致する文字列を前方に向かって探索します。
探索に成功するとドットは一致した文字列の直後に移動し、述語は成功します。
探索に失敗した場合には、ドットはバッファの最後に移動し、述語は失敗します。

なお、この述語を実行してもドットが移動するだけで画面表示は変化しません。
実行結果を画面に反映するには e_disp/0 を実行して画面を更新する必要があります。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]="appendという文字列を後方に探索し、それをconcatに変えたい場合には次のようになります。
e_fsearch("append"),e_backward(6),e_delete(6),e_insert("concat")"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="141"; hash["name"]="e_bsearch/1"; hash["common"]=""; hash["format"]="e_bsearch(+L){^G}"; hash["argument"]="L:検索する文字列の文字コードのリスト(ストリング)を指定する"; hash["text"]="ストリング(文字コードのリスト)からなる文字列を与えられると、その文字列と一 致する文字列を後方に向かって探索します。
探索に成功するとドットは一致した文字列の直前に移動し、述語は成功します。
探索に失敗した場合には、ドットはバッファの先頭に移動し、述語は失敗します。

なお、この述語を実行しただけではドットが移動するだけで画面のカーソルは移動しません。
画面のカーソルを移動するには e_disp/0 を実行して画面を更新する必要があります。
"; hash["reference"]=""; hash["sample"]="appendという文字列を後方に探索し、それをconcatに変えたい場合には次のようになります。
e_bsearch("append"),e_delete(6),e_insert("concat")"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="142"; hash["name"]="e_nword/1"; hash["common"]=""; hash["format"]="e_nword(-I) {^G}"; hash["argument"]="I:区切り文字の位置(バッファの先頭からの文字数)がユニファイされる"; hash["text"]="現在のドットから前方に捜し、最初に見つけた単語の次の区切り文字の位置をIにユニファイします。
区切り文字とは「空白」「.」「.」「/」「;」「\"」「'」
「(」「)」「[」「]」「-」「+」「*」「&」です。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="143"; hash["name"]="e_pword/1"; hash["common"]=""; hash["format"]="e_pword(-I) {^G}"; hash["argument"]="I:単語りの先頭文字の位置(バッファの先頭からの文字数)がユニファイされる"; hash["text"]="現在のドットからバッファの後方に捜して最初の単語の先頭文字の位置をIにユニファイします。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="144"; hash["name"]="e_disp/0"; hash["common"]=""; hash["format"]="e_disp"; hash["argument"]="なし"; hash["text"]="画面の更新を行います。
バッファの内容と画面の表示が異なっている場合に画面に更新された部分を表示し、ドットの次の文字の所にカーソルを表示します。
逆に言えば、それぞれの述語によってドット位置やバッファ内容を変更しても、この e_disp/0 を呼出して実行しないと、画面はまったく変化しないという事です。
そのため、AzEdit では一つのコマンドを実行するたびに、この述語を実行しています。

画面更新中にキーボードから入力が行われた時には、更新をそこで打ち切ります。

※スタンドアロン実行プログラムからこの述語を使用する場合、コンパイルオプション /curses を指定してコンパイルする必要があります。"; hash["reference"]=""; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="145"; hash["name"]="e_dline/1"; hash["common"]=""; hash["format"]="e_dline(-I)"; hash["argument"]="I:行数がユニファイされる"; hash["text"]="現在、AzEdit が使用している画面の行数(エコー行を除く)をIにユニファイします。

※スタンドアロン実行プログラムからこの述語を使用する場合、コンパイルオプション/curses を指定してコンパイルする必要があります。"; hash["reference"]=""; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="146"; hash["name"]="e_echo/0"; hash["common"]=""; hash["format"]="e_echo"; hash["argument"]="なし"; hash["text"]="エコー行(e_echo/1で表示される行)をクリアします。

※スタンドアロン実行プログラムからこの述語を使用する場合、コンパイルオプション/curses を指定してコンパイルする必要があります。"; hash["reference"]=""; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="147"; hash["name"]="e_echo/1"; hash["common"]=""; hash["format"]="e_echo(+N)"; hash["argument"]="N:表示したい一文字の文字コードを指定する"; hash["text"]="エコー行(エディタで使用している行の直後の行)にNで指定された文字コードに対応する文字を表示します。"; hash["reference"]=""; hash["sample"]="Ok と表示するには、
e_echo,e_echo(79),e_echo(107)
又は
e_echo,e_echo(\"O\"),e_echo(\"k\")
とします。
"; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="148"; hash["name"]="e_pos/2"; hash["common"]=""; hash["format"]="e_pos(-I1,-I2){^G}"; hash["argument"]="I1:カーソルの画面桁位置
I2:カーソルの画面行位置"; hash["text"]="ドットに対応する画面のカーソルの桁位置がI1に、行位置がI2にそれぞれユニファイされます。
カーソル座標は画面一番上の左端が(1,1)です。
このカーソルの位置は現在のドット位置で e_disp/0 を実行した時にカーソルが表示されるであろう位置です。
従って最後に e_disp/0 を実行した時点から現在までにドットが移動した場合は現在カーソルが表示されている位置とは一致しません。

※スタンドアロン実行プログラムからこの述語を使用する場合、コンパイルオプション
/curses を指定してコンパイルする必要があります。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="149"; hash["name"]="e_refresh/0"; hash["common"]=""; hash["format"]="e_refresh"; hash["argument"]="なし"; hash["text"]="AzEdit で使用している画面の部分をクリアします。この述語ではバッファの内容は表示されず、次にe_disp/0 が実行されたときに行われます。

※スタンドアロン実行プログラムからこの述語を使用する場合、コンパイルオプション/curses を指定してコンパイルする必要があります。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」

"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="150"; hash["name"]="e_repos/1"; hash["common"]=""; hash["format"]="e_repos(+N) {^G}"; hash["argument"]="N:画面物理行数を指定する"; hash["text"]="現在のドットのある行が、Nで示された画面の行にくるように画面を再配置します。
例えば、e_repos(1)により、ドットの位置を変えることなしに、カーソルを画面の先頭の行に持っていくことができます。(ただし、カーソルがドット位置を指している{一致している}場合)バッファの先頭からの行数が足りなくて再配置できない場合には何も行いません。
なお、この述語を実行しても画面表示は変化しません。
実行結果を画面に反映するには e_disp/0 を実行して画面を更新する必要があります。
"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]=""; hash["genre"]="27"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="151"; hash["name"]="restore/1"; hash["common"]=""; hash["format"]="restore(+A)"; hash["argument"]="A:ファイル名(パス指定も可)"; hash["text"]="すべてのファイルをクローズした後、指定されたバイナリファイルからプログラム
を読み込みます。save/1によって書き出されたファイルを読み込むことができます。
この save/1 によって書き出された時と同じ実行環境にできます。
一般に consult に比べ、構文解析などをしないため短時間で読み込むことができます。
この述語が実行されるとすべてのブレークレベルがキャンセルされ、インタープリタのトップレベルに制御が移ります。
また、プログラム中にこの述語を書いておくと、この述語を実行直後にプログラムの実行を強制終了し、インタープリタのトップレベルに制御が移ります。"; hash["reference"]="「(操)5.7ヒープ領域の保存」
"; hash["sample"]="| ?ーrestore('prolog.bin').
top_level
カレントディレクトリよりprolog.binをリストアしトップレベルに制御を移します。"; hash["genre"]="1"; hash["used"]="true"; hash["incident"]="save/1"; azlist.push(hash); var hash={}; hash["id"]="152"; hash["name"]="save/1"; hash["common"]=""; hash["format"]="save(+A)"; hash["argument"]="A:ファイル名(パス指定も可)"; hash["text"]="ヒープ領域にあるプログラム、その他の情報全てをバイナリイメージで引数で指定されたファイルに書き出します。
従ってファイルはバイナリ形式のファイルになります。
このファイルは restore/1 によって読み込むことができます。

【注意】
array、neuronもセーブされるが、neuronの知識自体はセーブされません。"; hash["reference"]="「(操)5.7ヒープ領域の保存」
"; hash["sample"]="| ?-save('prolog.bin').
yes
カレントディレクリの prolog.bin へ現在のヒープ領域にあるプログラム、その他の情報全てを書き出します。"; hash["genre"]="1"; hash["used"]="true"; hash["incident"]="restore/1"; azlist.push(hash); var hash={}; hash["id"]="153"; hash["name"]="see/1"; hash["common"]=""; hash["format"]="see(+A)"; hash["argument"]="A:入力ストリーム(ファイル)名"; hash["text"]="Aで指定されたファイルを入力ファイルとしてオープンし、現在の入力ストリームをそのファイルに切換えます。
また、Aで指定されたファイルが入力ファイルとしてオープンされている場合は現在の入力ストリームをそのファイルに切換える事のみとします。"; hash["reference"]="「(操)5.6ストリーム入出力」
"; hash["sample"]="| ?-see('test.txt'),read(X),seen.
X = d(1000)"; hash["genre"]="2"; hash["used"]="true"; hash["incident"]="seen/1
close/1
seeing/1"; azlist.push(hash); var hash={}; hash["id"]="154"; hash["name"]="see/2"; hash["common"]=""; hash["format"]="see(+A,-S), open(+A,read,-S)"; hash["argument"]="A:入力ファイル名
S:入力ストリーム値"; hash["text"]="Aを入力ファイルとしてオープンし、そのストリーム値をSにユニファイします。
このストリーム値を read/2,get/2,get0/2 の第一引数に渡すと現在の入力ストリームに関係無く指定のファイルから入力します。
入力終了後は必ず seen/1 または close/1 でクローズします。
ISOのopen/3と同じです。

【注意】
seen/0 ではクローズ出来ません。
現在の入力ストリームには影響しません(切換わらない)。"; hash["reference"]="「(操)5.6ストリーム入出力」"; hash["sample"]="| ?-see(test,S),get(S,X),seen(S).
S = fp_6600,
X = 96
yes

| ?-open('test',read,S),get_code(S,X),close(S).
S = fp_123,
X = 96
yes

test というファイルの先頭の一文字のキャラクターコードを X にユニファイします。"; hash["genre"]="2"; hash["used"]="true"; hash["incident"]="seen/1
close/1
open/3"; azlist.push(hash); var hash={}; hash["id"]="155"; hash["name"]="seeing/1"; hash["common"]=""; hash["format"]="seeing(-A)"; hash["argument"]="A:現在の入力ストリーム(入力対象となっているファイル名)"; hash["text"]="現在の入力ストリーム(現在、入力対象となっているファイル名)をAにユニファイされる。
立上げ直後のデフォルト値は user(キーボード)です。"; hash["reference"]="「(操)5.6ストリーム入出力」
"; hash["sample"]="| ?-seeing(F).
F = user
yes

| ?-see('test.pl'),read(X),seeing(F),seen.
X = a:-b,
F = test.pl
yes"; hash["genre"]="2"; hash["used"]="true"; hash["incident"]="see/1"; azlist.push(hash); var hash={}; hash["id"]="156"; hash["name"]="seen/0"; hash["common"]=""; hash["format"]="seen"; hash["argument"]="なし"; hash["text"]="現在の入力ストリームであるファイル(最も最近に see/1 によってオープン、又は切換えられたファイル)をクローズし、入力ストリームを see/1 が実行される前の入力ストリームに戻します。


◎注意
see/2 によってオープンされたファイルはこの seen/0 ではクローズ出来ません。
"; hash["reference"]="「(操)5.6ストリーム入出力」
"; hash["sample"]="| ?-see('test.txt'),read(X),seen.
X = d(1000)
yes"; hash["genre"]="2"; hash["used"]="true"; hash["incident"]="seen/1"; azlist.push(hash); var hash={}; hash["id"]="157"; hash["name"]="seen/1"; hash["common"]=""; hash["format"]="seen(+S)"; hash["argument"]="S:入力ファイルをsee/2 によってオープンしたときに返されたストリーム値"; hash["text"]="see/2 によってオープンされた入力ファイルをクローズします。
なお、現在の入力ストリームには影響を与えません。"; hash["reference"]="「(操)5.6ストリーム入出力」
"; hash["sample"]="| ?-see(test,S),get(S,X),seen(S).
S = fp_6600,
X = 96
yes

testというファイルの先頭の一文字のキャラクターコードを X にユニファイします"; hash["genre"]="2"; hash["used"]="true"; hash["incident"]="see/2"; azlist.push(hash); var hash={}; hash["id"]="158"; hash["name"]="tell/1"; hash["common"]=""; hash["format"]="tell(+A)"; hash["argument"]="A:出力ストリーム(ファイル)名"; hash["text"]="Aで指定されたファイルを出力ファイルとしてオープンし、現在の出力ストリームをそのファイルに切換えます。
また、Aで指定されたファイルが出力ファイルとしてオープンされている場合は現在の出力ストリームをそのファイルに切換える事のみします。

【注意】
既に同名ファイルが存在する場合はオープンした時点でその内容が消去されます。"; hash["reference"]="「(操)5.6ストリーム入出力」
"; hash["sample"]="| ?-tell('abc.txt'),write(abcdefgh),told.
yes

abc.txt というファイルに abcdefgh というアトムを書込む"; hash["genre"]="2"; hash["used"]="true"; hash["incident"]="telling/1
told/0"; azlist.push(hash); var hash={}; hash["id"]="159"; hash["name"]="tell/2"; hash["common"]=""; hash["format"]="tell(+A,-S), open(+A,write,-S)"; hash["argument"]="A:出力ファイル名
S:出力ストリーム値"; hash["text"]="Aを出力ファイルとしてオープンし、そのストリーム値をSにユニファイします。
このストリーム値を write/2, put/2, put_code/2, put_char/2 の第一引数に渡すと現在の出力ストリームに関係無く指定のファイルへ出力します。
出力終了後は必ず told/1 または close/1 でクローズします。
ISOのopen/3と同じです。

【注意】
told/0 ではクローズ出来ません。
現在の出力ストリームには影響しません(切換わりません)。"; hash["reference"]="「(操)5.6ストリーム入出力」
"; hash["sample"]="| ?-tell('abc.txt',S),write(S,abcdefgh),told(S).
S = fp_628c9a0

| ?-open('abc.txt',write,S),write(S,abcdefgh),nl(S),close(S).

abc.txt というファイルに abcdefgh というアトムを書込みます。"; hash["genre"]="2"; hash["used"]="true"; hash["incident"]="told/1
close/1
tella/1
open/3"; azlist.push(hash); var hash={}; hash["id"]="160"; hash["name"]="tella/1"; hash["common"]=""; hash["format"]="tella(+A)"; hash["argument"]="A:ファイル名"; hash["text"]="アペンドモードでオープンされる以外は tell/1 と同じ機能を持ちます。
アペンドモードとは同名ファイルが既に存在する場合、その内容はそのままにしておき、以降に書込むデータをそのファイルの最後に追加するモードです。"; hash["reference"]="「(操)5.6ストリーム入出力」
"; hash["sample"]="?-tell('abc.txt'),write(abc),told.
yes
?-tella('abc.txt'),write(def),told.
yes
?-

この結果、abc.txt というファイルの内容は abcdef となります。"; hash["genre"]="2"; hash["used"]="true"; hash["incident"]="tell/1"; azlist.push(hash); var hash={}; hash["id"]="161"; hash["name"]="tella/2"; hash["common"]=""; hash["format"]="tella(+A,-S), open(+A,append,-S)"; hash["argument"]="A:ファイル名
S:出力ストリーム値"; hash["text"]="アペンドモードでオープンされる以外は tell/2, open/3(write) と同じ機能を持ちます。
アペンドモードとは同名ファイルが既に存在する場合、その内容はそのままにしておき、以降に書込むデータをそのファイルの最後に追加するモードです。
ISOのopen/3と同じです。"; hash["reference"]="「(操)5.6ストリーム入出力」
"; hash["sample"]="| ?-tell('abc.txt',S),write(S,abc),told(S).
S = fp_66dc9a0

| ?-tella('abc.txt',S),write(S,def),told(S).
S = fp_66dc9a0

| ?-open('abc.txt',append,S),write(S,gh),close(S).

この結果、abc.txt というファイルの内容は abcdefgh となります。"; hash["genre"]="2"; hash["used"]="true"; hash["incident"]="tell/2
open/3"; azlist.push(hash); var hash={}; hash["id"]="162"; hash["name"]="telling/1"; hash["common"]=""; hash["format"]="telling(-A)"; hash["argument"]="A:現在の出力ストリーム(出力対象となっているファイル名)がユニファイされる。
"; hash["text"]="現在の出力ストリーム(現在、出力対象となっているファイル名)がAにユニファイされる。
立上げ直後のデフォルト値は user(ディスプレイ)です。"; hash["reference"]="「(操)5.6ストリーム入出力」
"; hash["sample"]="| ?-telling(F).
F = user
yes

| ?-tell('test.pl'),write((a:-b)),put(46),telling(F),told.
F = test.pl
yes"; hash["genre"]="2"; hash["used"]="true"; hash["incident"]="tell/1"; azlist.push(hash); var hash={}; hash["id"]="163"; hash["name"]="told/0"; hash["common"]=""; hash["format"]="told"; hash["argument"]="なし"; hash["text"]="現在の出力ストリームであるファイル(最も最近に tell/1 によってオープン、又は切換えられたファイル)をクローズし、出力ストリームを tell/1 が実行される前の出力ストリームに戻します。

【注意】
tell/2 によってオープンされたファイルはこの told/0 ではクローズ出来ません。"; hash["reference"]="「(操)5.6ストリーム入出力」
"; hash["sample"]="?-tell('abc.txt'),write(abcdefgh),told.
yes

abc.txt というファイルに abcdefgh というアトムを書込みます。"; hash["genre"]="2"; hash["used"]="true"; hash["incident"]="tell/1"; azlist.push(hash); var hash={}; hash["id"]="164"; hash["name"]="told/1"; hash["common"]=""; hash["format"]="told(+S), close(+S)"; hash["argument"]="S:出力ファイルをtell/2, open/3 によってオープンしたときに返されたストリーム値"; hash["text"]="tell/2, open/3 によってオープンされた出力ファイルをクローズします。
なお、現在の出力ストリームには影響を与えません。
ISOのclose/1と同じです。"; hash["reference"]="「(操)5.6ストリーム入出力」
"; hash["sample"]="| ?-tell('abc.txt',S),write(S,abcdefgh),told(S).
S = fp_66dc9a0 <== abc.txt というファイルに abcdefgh というアトムを書込みます
| ?-open('abc.txt',write,S),write(S,abc),close(S).
S = fp_123 <== abc.txtというファイルに abcというアトムを書き込みます。
yes"; hash["genre"]="2"; hash["used"]="true"; hash["incident"]="tell/2
open/3
close/1"; azlist.push(hash); var hash={}; hash["id"]="165"; hash["name"]="listing/0"; hash["common"]=""; hash["format"]="listing"; hash["argument"]="なし"; hash["text"]="ヒープ領域に登録(consult 又は assert)されたプログラムを現在の出力ストリームに出力します。
通常は出力ストリームがコンソール画面になっていますから、画面に出力(表示)します。
tell/1 などで出力ストリームを切換えると、任意のファイルに出力出来ます。
このファイルは標準テキストファイルになります。

ユーザーモードの場合はユーザ述語のみ、システムモードの場合はシステム述語のみを出力します。

また、既にコンパイルされて「コンパイル組込み述語」になった述語はは出力できません。
型付素性構造モードにおいては、型定義の内容も出力します。"; hash["reference"]="「(操)5.6ストリーム入出力」
"; hash["sample"]="| ?-listing.

プログラム出力

yes"; hash["genre"]="3"; hash["used"]="true"; hash["incident"]="tell/1"; azlist.push(hash); var hash={}; hash["id"]="166"; hash["name"]="listing/1"; hash["common"]=""; hash["format"]="listing(+A・A/I・L)"; hash["argument"]="
A :出力したい述語名
A/I :出力したい述語名/アリティ
L :複数の A 又は A/I を要素とするリスト
"; hash["text"]="listing/0 と同様にヒープ領域に登録(consult 又は assert)されたプログラムを現在の出力ストリームに出力します。
listing/0 との違いは引数によって出力する述語を限定できる事です。
述語名とアリティを指定した場合はその述語のみを出力します。
述語名のみを指定した場合は、アリティに関係無くその述語名の述語をすべて出力します。
述語指定の並びをリスト形式にすると複数の述語を出力することが出来ます。

指定された述語がヒープ領域に無かった場合は、何もせずに成功します。"; hash["reference"]="「(操)5.6ストリーム入出力」
"; hash["sample"]="| ?-listing.
a.
a(X,Y,Z) :- Z is X+Y.
b :- a.
b(X) :- write(X).
yes
| ?-listing(a).
a.
a(X,Y,Z) :- Z is X+Y.
yes
| ?-listing(b/1).
b(X) :- write(X).
yes"; hash["genre"]="3"; hash["used"]="true"; hash["incident"]="listing/0
tell/1"; azlist.push(hash); var hash={}; hash["id"]="167"; hash["name"]="listing/2"; hash["common"]=""; hash["format"]="listing(+S,+A・A/I・L)"; hash["argument"]="
S :tell/2,tella/2の第2引数に返されたストリーム値
:tell/2,tella/2の第2引数に返されたストリーム値
A :出力したい述語名
A/I :出力したい述語名/アリティ
L :複数の A 又は A/I を要素とするリスト
"; hash["text"]="現在のストリームに関わり無くSで識別されるストリームにヒープ領域に存在するプログラムを出力します。
それ以外の機能はlisting/1と同じです。"; hash["reference"]="「(操)5.6ストリーム入出力」
listing/1 tell/2"; hash["sample"]="| ?-listing.
a.
a(X,Y,Z) :- Z is X+Y.
b :- a.
b(X) :- write(X).
yes
| ?-tell('test.pl',S),listing(S,a),told(S).
S = fp_66dc9a0
| ?-

----------------------------------------

a.
a(X,Y,Z) :- Z is X+Y."; hash["genre"]="3"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="168"; hash["name"]="read/1"; hash["common"]="ISO"; hash["format"]="read(-T)"; hash["argument"]="T:読み込まれた項がユニファイされる"; hash["text"]="現在の入力ストリームから項を一つ読み込みます。
現在の入力ストリームが「user」 か「con」の場合は画面に現在のプロンプトが現れてキー入力待ちの状態になります。ここで項を入力し最後に 「.」(ピリオド)を入力してリターンキーを押すと、その項がTとユニファイされます。

現在の入力ストリームがディスク上の「項1<終止符>項2<終止符>・・・項n<終止符>」という書式のファイルならば現在のファイルポインタが指す項を読み込んでTにユニファイします。そして、ファイルポインタを次の項に移します。
ファイルの最後まで来ると「end_of_file」というアトムをTにユニファイします。
「end_of_file」が返されたにもかかわらず同じファイルで続けて読み込もうとするとエラー(End of file encountered)になります。

・なお、この述語は決定性述語なのでバックトラックしてきても失敗します。
繰返して実行する場合は repeat/0,repeat/1 を前に書きます。
・空白など項として許されない文字が含まれている場合はエラー(syntax error)
となります。
ただし、この場合でもシングルクォートで囲ってアトムすれば入力できます。
・未代入の変数を入力した場合はTも未代入のままになります。
・ストリングを入力した場合はその実態であるキャラクタコードのリストに変換さ
れます。"; hash["reference"]="「(操)5.6ストリーム入出力」
"; hash["sample"]="| ?-see(test),repeat,read(X),write(X),nl,X==end_of_file,seen.
abc
def
ghi
end_of_file
yes
| ?-read(X).
|:abcdefg.
X = abcdefg
yes

| ?-read(X).
|:'abc defg'.
X = abc defg
yes

| ?-read(X).
|:Y.
X = X
yes

| ?-read(X).
|:"abc".
X = [97,98,99]
yes"; hash["genre"]="4"; hash["used"]="true"; hash["incident"]="write/1
writeq/1"; azlist.push(hash); var hash={}; hash["id"]="169"; hash["name"]="read/2"; hash["common"]="ISO"; hash["format"]="read(+S,-T)"; hash["argument"]="
S :指定ファイルのストリーム値
(see/2 open/3でファイルオープンしたとき第2引数に返された値)
T :読み込まれた項がユニファイされる
"; hash["text"]="read/1 が現在の入力ストリームから読み込むのに対して、現在の入力ストリームに関係無く see/2 open/3 でオープンされた任意の入力ストリームから項を読み込む事が出来ます。
入力ストリームの指定はファイル名ではなくストリーム値で指定します。
複数の入力ストリームがある(複数のファイルがオープンされている)場合にいちいち現在の入力ストリームを切換えなくてもよいので便利です。
これ以外は read/1 と同じです。"; hash["reference"]="「(操)5.6ストリーム入出力」
"; hash["sample"]="| ?-see(test,S),repeat,read(S,X),write(X),nl,X==end_of_file,seen(S).
abc
def
ghi
end_of_file
yes"; hash["genre"]="4"; hash["used"]="true"; hash["incident"]="read/1
see/2
open/3"; azlist.push(hash); var hash={}; hash["id"]="170"; hash["name"]="display/1"; hash["common"]=""; hash["format"]="display(+T), write_canonical(+T)"; hash["argument"]="T:出力する項"; hash["text"]="Tを正規の表現で現在の出力ストリームに出力します。
ISOの write_canonical/1にほぼ同じです。

・演算子形式の複合項は述語形式に直されて出力されます。
・ストリングはその実態であるキャラクタコードのリストととして出力されます。
・リスト形式の複合項は述語形式に直されず、そのまま出力されます。
・未代入の変数の場合は変数名がそのまま出力されます。"; hash["reference"]=""; hash["sample"]="| ?-write_canonical(1+2),nl.
+(1,2)
yes
| ?-display('abcdef'),nl.
abcdef
yes
| ?-display('ABCDEF'),nl.
'ABCDEF'
yes
| ?-display('abc def'),nl.
'abc def'
yes
| ?-display('A'(123)),nl.
'A'(123)
yes
| ?-display(1+2*3),nl.
+(1,*(2,3))
yes
| ?-display(\"abc\"),nl.
[97,98,99]
yes"; hash["genre"]="4"; hash["used"]="true"; hash["incident"]="tell/1
tella/1
read/1
writeq/1
write_canonical/1"; azlist.push(hash); var hash={}; hash["id"]="171"; hash["name"]="write/1"; hash["common"]="ISO"; hash["format"]="write(+T), put_char(+A)"; hash["argument"]="T:出力する項
A:出力する1文字"; hash["text"]="Tをほとんどそのままの表現で現在の出力ストリーム(デフォルトは user{ディスプレイ画面})に出力します。
put_char/1は1文字を出力します。

・Tがアトム、演算子形式やリスト形式の複合項の場合はそのまま出力されます。
・Tがn進数表現の数値は全て10進数表現になります。
 最上位桁からのゼロの並びは無視され出力されません。
 実数の場合は小数点以下6桁に丸められます。
・Tが未代入の変数の場合はその変数名が出力されます。
・Tに空白などの項として許されない記号が含まれる場合はエラー(syntax error)となります。
 この場合シングルクォートで囲ってアトムにしてしまえば差し支えありません。
 ただし、囲ったシングルクォートは出力されません。
 よって、ファイルに出力しても read/1 で読めません。
 (read/1 で読みたい場合は writeq/1 を使います)"; hash["reference"]=""; hash["sample"]="| ?-put_char(a),nl.
a
yes
| ?-write(abcdef),nl.
abcdef
yes
| ?-write('abcdef'),nl.
abcdef
yes
| ?-write('ABCD'),nl.
ABCD
yes
| ?-write(X),nl.
X_7
X = X
yes
| ?-write(000123),nl.
123
yes
| ?-write(0.12345678),nl.
0.123456780000000
yes
| ?-write(0.123),nl.
0.123000000000000
yes
| ?-write(0'123),nl.
291
yes
| ?-write(a:-b),nl.
Syntax error
| ?-write((a :- b)),nl.
a:-b
yes
| ?-write(abc def),nl.
Syntax error
| ?-write('abc def'),nl.
abc def
yes
| ?-tell(test),write(abcd),nl,told.
yes
| ?-"; hash["genre"]="4"; hash["used"]="true"; hash["incident"]="writeq/1
display/1
tell/1
put_char/1"; azlist.push(hash); var hash={}; hash["id"]="172"; hash["name"]="write/2"; hash["common"]="ISO"; hash["format"]="write(+S,+T), put_char(+S,+A)"; hash["argument"]="S:指定ストリームのストリーム値(tell/2,tella/2,open/3 でファイルオープンしたとき第2引数 or 第3引数に返された値)
T:出力する項
A:出力する1文字"; hash["text"]="write/1 が現在の出力ストリームへ出力するのに対して、現在の出力ストリームに関係無く tell/2,tella/2, open/3 でオープンされた任意の出力ストリームへ項を出力する事が出来ます。put_char/2は1文字を出力します。
ストリームの指定はファイル名ではなくストリーム値で指定します。
複数のファイルストリームがある(複数のファイルがオープンされている)場合にいちいち現在のファイルストリームを切換えなくてもよいので便利です。
これ以外は write/1, put_char/1 と同じです。"; hash["reference"]=""; hash["sample"]="| ?-tell(test,S),write(S,a(123)),told(S).
yes

| ?-open('test',write,S),put_char(S,a),close(S).
yes <== testというファイルに a を書き込みます。"; hash["genre"]="4"; hash["used"]="true"; hash["incident"]="write/1
tell/2
tella/2
told/1
put_char/2"; azlist.push(hash); var hash={}; hash["id"]="173"; hash["name"]="writeq/1"; hash["common"]="ISO"; hash["format"]="writeq(+T)"; hash["argument"]="T:出力する項"; hash["text"]="Tをほとんどそのままの表現で現在の出力ストリーム(デフォルトは user{ディスプレイ画面})に出力します。
write/1 との違いは空白などが混じったアトムとして許されない文字列をシングルクォートで囲ってアトムとしてTに与えた場合にシングルクォートで囲ったまま出力し、それを read/1 か read/2 で入力できる所です。
それ以外は write/1 とまったく同じです。
ただし、 read/1 か read/2 で入力するには、Tに続けて<終止符(ピリオド「.」+キャラクタコード32以下の文字)> を出力しておく必要があります。"; hash["reference"]=""; hash["sample"]="| ?-tell(test),writeq('A B C'),write(.),nl,told.
yes
| ?-see(test),read(X),seen.
X = A B C
yes"; hash["genre"]="4"; hash["used"]="true"; hash["incident"]="write/1
read/1
tell/1
told/0"; azlist.push(hash); var hash={}; hash["id"]="174"; hash["name"]="writeq/2"; hash["common"]="ISO"; hash["format"]="writeq(+S,+T)"; hash["argument"]="
S :指定ストリームのストリーム値
(tell/2,tella/2 でファイルオープンしたとき第2引数に返された値)
T :出力する項
"; hash["text"]="writeq/1 が現在の出力ストリームへ出力するのに対して、現在の出力ストリームに関係無く tell/2,tella/2 でオープンされた任意の出力ストリームへ項を出力する事が出来ます。
ストリームの指定はファイル名ではなくストリーム値で指定します。
複数のファイルストリームがある(複数のファイルがオープンされている)場合にいちいち現在のファイルストリームを切換えなくてもよいので便利です。
これ以外は writeq/1 と同じです。"; hash["reference"]=""; hash["sample"]="| ?-tell(test,S),writeq(S,'A B C'),write(S,.),nl,told(S).

S = fp_668e090
yes
| ?-see(test),read(X),seen.
X = A B C
yes"; hash["genre"]="4"; hash["used"]="true"; hash["incident"]="write/1
writeq/1
tell/2
tella/2
told/1"; azlist.push(hash); var hash={}; hash["id"]="175"; hash["name"]="get/1"; hash["common"]=""; hash["format"]="get(-I)"; hash["argument"]="I:入力したキャラクタ(ASCII)又は漢字コードがユニファイされる"; hash["text"]="現在の入力ストリームの現在のファイルポインタの指し示す位置から一文字読み込みます。
そしてファイルポインタを一文字分(1バイトか多バイト文字の場合、そのバイト数)ファイルの最後尾に向って移動させます。
ただし、以外のキャラクタ(ASCII)コード32以下の文字は読み飛ばします。
漢字モードがonの状態で読み込もうとする文字が漢字などの多バイト(全角)文字であると判断された場合はそのバイト数(漢字コード分)を読み込んでその整数をIにユニファイします。
漢字モードがoffの場合は多バイト文字でも1バイトだけ読み込みます。"; hash["reference"]="「(操)5.8日本語処理と漢字モード」
"; hash["sample"]="[A:\\]TYPE TEST1.DAT
a b

[A:\\]PROLOG

| ?-see('test1.dat'),get(X1),get(X2),seen,name(A,[X1,X2]).
X1 = 97,
X2 = 98,
A = ab
yes
[A:\\]TYPE TEST2.DAT
漢字

[A:\\]PROLOG

| ?-see('test2.dat'),get(X1),get(X2),seen,name(A,[X1,X2]).
X1 = 35519,
X2 = 36519,
A = 漢字
yes
| ?-kanji_mode(_,off).
_ = on
yes
| ?-see('test2.dat'),get(X1),get(X2),seen,name(A,[X1,X2]).
X1 = 138,
X2 = 111,
A = 漢
yes"; hash["genre"]="5"; hash["used"]="true"; hash["incident"]="see/1
kanji_mode/2
put/1"; azlist.push(hash); var hash={}; hash["id"]="176"; hash["name"]="get/2"; hash["common"]=""; hash["format"]="get(+S,-I)"; hash["argument"]="
S :指定ストリームのストリーム値(see/2 でファイルオープンしたとき第2引数に返された値)
I :入力したキャラクタ(ASCII)コードがユニファイされる
"; hash["text"]="get/1 が現在のストリームから読み込むのに対して、現在のストリームに関係無く
see/2 でオープンされた任意のストリームから読み込む事が出来ます。
ストリームの指定はファイル名ではなくストリーム値で指定します。
複数の入力ストリームがある(複数のファイルがオープンされている)場合にいち
いち現在の入力ストリームを切換えなくてもよいので便利です。
これ以外は get/1 と同じです。"; hash["reference"]="「(操)5.8日本語処理と漢字モード」
get/1 see/2kanji_mode/2 put/1 put/2"; hash["sample"]="[A:]TYPE TEST1.DAT
a b

[A:]PROLOG

| ?-see('test1.dat',S),get(S,X1),get(S,X2),seen,name(A,[X1,X2]).
X1 = 97,
X2 = 98,
A = ab
yes"; hash["genre"]="5"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="177"; hash["name"]="get0/1"; hash["common"]=""; hash["format"]="get0(-I)"; hash["argument"]="I:入力したキャラクタ(ASCII)コードがユニファイされる"; hash["text"]="現在の入力ストリームから一文字読み込んでそのキャラクタ・コードとX とを単一化します。get/1 のようにキャラクタ(ASCII)コードの32以下を読み飛ばすことはしません。
その際、改行文字コードはキャラクタ・コード31キャラクタ・コード31の一文字に変換されます。
これは、改行文字コードがほとんどの場合、1組にして使われるので1バイトにまとめた方がプログラムを組む上で都合が良いと考えられるためです。
(内蔵エディタのバッファ内でも改行文字の代わりにキャラクタ・コード31の一文字が使われています)
漢字モードがonの場合の処理は get/1 を参照して下さい。"; hash["reference"]=""; hash["sample"]="| ?-tell(test),put(13),put(10),told. <== 改行文字コードだけのファイルを作ります。
yes
| ?-see(test),get0(X),seen.
X = 31 <== 改行を入力すると31を返します。
yes "; hash["genre"]="5"; hash["used"]="true"; hash["incident"]="get/1
get1/2
see/1
put/1"; azlist.push(hash); var hash={}; hash["id"]="178"; hash["name"]="get0/2"; hash["common"]=""; hash["format"]="get0(+S,-I)"; hash["argument"]="
S :指定ファイルのストリーム値
(see/2 でファイルオープンしたとき第2引数に返された値)
I :入力したキャラクタ(ASCII)コードがユニファイされる
"; hash["text"]="get0/1 が現在の入力ストリームから読み込むのに対して、現在のストリームに関係無くsee/2 でオープンされた任意のストリームから読み込む事が出来ます。
ストリームの指定はファイル名ではなくストリーム値で指定します。
複数の入力ストリームがある(複数のファイルがオープンされている)場合にいちいち現在の入力ストリームを切換えなくてもよいので便利です。
これ以外は get0/1 と同じです。"; hash["reference"]=""; hash["sample"]="| ?-tell(test),put(13),put(10),told.
yes <== 改行文字だけのファイルを作ります。
| ?-see(test,S),get0(S,X),seen(S).
S = fp_6812
X = 31 <== 改行を入力すると31を返します。
yes"; hash["genre"]="5"; hash["used"]="true"; hash["incident"]="get0/1
get/2
see/2
put/1
put/2"; azlist.push(hash); var hash={}; hash["id"]="179"; hash["name"]="get1/1"; hash["common"]=""; hash["format"]="get1(-I), get_code(-I)"; hash["argument"]="I:入力したキャラクタ(ASCII)コードがユニファイされる"; hash["text"]="現在の入力ストリームから一文字読み込んでそのキャラクタ・コードとX とを単一化します。
get/1 のようにキャラクタ(ASCII)コードの32以下を読み飛ばすことはしません。
また、get0/1 と違い改行文字も変換せずそのまま返します。
漢字モードがonの場合の処理は get/1 get0/1 と同じです。
ISOのget_code/1と同じです。"; hash["reference"]=""; hash["sample"]="| ?-tell(test),put(13),put(10),told. <== 改行文字だけのファイルを作ります。
yes
| ?-see(test),get1(X1),get1(X2),seen.
X1 = 13 <== 改行文字コードもそのまま返します。
X2 = 10
yes

abc.txtというファイルの中身が ab のとき

| ?-see('abc.txt'),get_code(X1),get_code(X2),seen.
X1 = 97,
X2 = 98
yes
"; hash["genre"]="5"; hash["used"]="true"; hash["incident"]="get0/1
get/2
see/2
put/1
put/2"; azlist.push(hash); var hash={}; hash["id"]="180"; hash["name"]="get1/2"; hash["common"]=""; hash["format"]="get1(+S,-I), get_code(+S,-I)"; hash["argument"]="
S :指定ファイルのストリーム値(see/2 でファイルオープンしたとき第2引数に返された値)
I :入力したキャラクタ(ASCII)コードがユニファイされる
"; hash["text"]="get1/1 が現在の入力ストリームから読み込むのに対して、現在のストリームに関係無くsee/2, open/3 でオープンされた任意のストリームから読み込む事が出来ます。
ストリームの指定はファイル名ではなくストリーム値で指定します。
複数の入力ストリームがある(複数のファイルがオープンされている)場合にいちいち現在の入力ストリームを切換えなくてもよいので便利です。
これ以外は get1/1 と同じです。
ISOのget_code/2と同じです。"; hash["reference"]=""; hash["sample"]="| ?-tell(test),put(13),put(10),told. <== 改行文字だけのファイルを作ります。
yes
| ?-see(test,S),get1(S,X1),get1(S,X2),seen(S).
S = fp_6812
X1 = 13 <== 改行文字コードもそのまま返します。
X2 = 10
yes

| ?-open('test',read,S),get_code(S,X1),get_code(S,X2),close(S).
S = fp_6812,
X1 = 13,
X2 = 10
yes"; hash["genre"]="5"; hash["used"]="true"; hash["incident"]="get1/1
get0/2
see/2
seen/1
open/3
close/1
put/1
put_code/2
get_char/2"; azlist.push(hash); var hash={}; hash["id"]="181"; hash["name"]="put/1"; hash["common"]=""; hash["format"]="put(+N), put_code(+N)"; hash["argument"]="N:出力する文字のキャラクタ(ASCII)又は漢字コード"; hash["text"]="現在の出力ストリームにNをキャラクタ(ASCII)又は漢字コードとする文字を出力します。
ISOのput_code/1と同じです。

ただし、次の場合は動作が多少異なります。
・Nの値が31の場合
対象の出力ストリームが「edit」(エディタバッファ)の場合は(31を改行コードとして使っているので)そのまま31が出力されます。
それ以外のファイルの場合は改行文字コードに変換して出力されます。
つまり、get0/1 と併せるとPrologプログラム上ではをキャラクタコードの31の1バイト(1文字)を改行文字コードの代りとして扱う事が出来ます。

・まず、Nを2進数表現したとき、漢字コードと見なして、該当の文字があればその多バイト(全角)文字を出力します。
もし、該当の文字がなければ下位8桁(1バイト)のみをキャラクターコードと見なして、該当の文字を出力します。

・漢字モードはロギング(「(操)5.9ロギング」参照)にのみ関係します。
漢字モード「on」の場合はこの put/1 でコンソールに出力された1バイト文字・多バイト(全角)文字共にログファイルにも出力されます。
これに対して漢字モード「off」の場合はこの put/1 でコンソールに出力された1バイト文字はログファイルにも出力されますが、多バイト(全角)文字がコンソールに出力された場合にはログファイルには出力されません。(Prolog-KABAと同じ)"; hash["reference"]="「(操)5.8日本語処理と漢字モード」"; hash["sample"]="| ?-tell(test),put(31),told. <== 31 が改行文字コードに変換して、出力される<
yes
| ?-see(test),get1(X1),get1(X2),seen.
X1 = 13 <== 確かに改行文字コードに変換されている
X2 = 10
yes

| ?-put_code(97),nl.
a
yes"; hash["genre"]="5"; hash["used"]="true"; hash["incident"]="tell/1
kanji_mode/2
get1/1
put/2
put_code/2
get_code/1"; azlist.push(hash); var hash={}; hash["id"]="182"; hash["name"]="put/2"; hash["common"]=""; hash["format"]="put(+S,+N), put_code(+S,+N)"; hash["argument"]="
S :指定ストリームのストリーム値
(tell/2 でファイルオープンしたとき第2引数に返された値)
N :出力する文字のキャラクタ(ASCII)又は漢字コード
"; hash["text"]="put/1 が現在の出力ストリームへ出力するのに対して、現在の出力ストリームに関係無く tell/2 でオープンされた任意の出力ストリームへ出力する事が出来ます。
ストリームの指定はファイル名ではなくストリーム値で指定します。
複数のファイルストリームがある(複数のファイルがオープンされている)場合にいちいち現在のファイルストリームを切換えなくてもよいので便利です。
これ以外は put/1 と同じです。
ISOのput_code/2と同じです。"; hash["reference"]=""; hash["sample"]="| ?-tell(test,S),put(S,31),told(S). <== 31 が改行文字に変換して、出力されます。
S = fp_6812
yes
| ?-open('test.dat',write,S),put_code(S,97),put_code(S,98),put_code(S,31),close(S).
S = fp_689bfe0 <== test.datに abと改行が書き込まれます。
yes"; hash["genre"]="5"; hash["used"]="true"; hash["incident"]="put/1
put_code/1
tell/2
tella/2
told/1
open/3
close/1"; azlist.push(hash); var hash={}; hash["id"]="183"; hash["name"]="tab/1"; hash["common"]=""; hash["format"]="tab(+N)"; hash["argument"]="N:出力したい空白の数"; hash["text"]="現在の出力スリームにNの個数だけ、空白(キャラクタコードの32)を出力します。
つまり、put(32) をN回繰返したのと同じです。"; hash["reference"]=""; hash["sample"]="| ?-write(abc),tab(3),write(def),nl.
abc def
yes"; hash["genre"]="5"; hash["used"]="true"; hash["incident"]="put/1
tell/1"; azlist.push(hash); var hash={}; hash["id"]="184"; hash["name"]="tab/2"; hash["common"]=""; hash["format"]="tab(+S,+N)"; hash["argument"]="
S: 指定ファイルのストリーム値
(tell/2 でファイルオープンしたとき第2引数に返された値)
N: 出力したい空白の数
"; hash["text"]="tab/0 が現在の出力ストリームへ空白(キャラクタコードの32)を出力するのに対して、現在の出力ストリームに関係無く tell/2 でオープンされた任意の出力ストリームへ空白(キャラクタコードの32)を出力する事が出来ます。
ストリームの指定はファイル名ではなくストリーム値で指定します。
複数のファイルストリームがある(複数のファイルがオープンされている)場合にいちいち現在のファイルストリームを切換えなくてもよいので便利です。
これ以外は tab/1 と同じです。"; hash["reference"]=""; hash["sample"]="| ?-tell(con,S),write(S,abc),tab(S,3),write(S,def),nl(S),told(S).
abc def
S = fp_6812
yes"; hash["genre"]="5"; hash["used"]="true"; hash["incident"]="tab/1
tell/2"; azlist.push(hash); var hash={}; hash["id"]="185"; hash["name"]="nl/0"; hash["common"]="ISO"; hash["format"]="nl"; hash["argument"]="なし"; hash["text"]="現在の出力スリームに改行文字コードを出力します。
対象の出力ストリームが「edit」(エディタバッファ)の場合は(31を改行コードとして使っているので)そのまま31が出力されます。
それ以外のファイルの場合は改行文字コードが出力されます。
つまり、put(31) と同じです。"; hash["reference"]="put/1
tell/1"; hash["sample"]="| ?-write(abc),nl,write(def),nl.
abc
def
yes"; hash["genre"]="5"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="186"; hash["name"]="nl/1"; hash["common"]="ISO"; hash["format"]="nl(+S)"; hash["argument"]="S:指定ファイルのストリーム値
(tell/2 open/3 でファイルオープンしたとき第2引数に返された値)"; hash["text"]="nl/0 が現在の出力ストリームへ改行文字コードを出力するのに対して、現在の出力ストリームに関係無く tell/2 でオープンされた任意の出力ストリームへ改行文字コードを出力する事が出来ます。
ストリームの指定はファイル名ではなくストリーム値で指定します。
複数のファイルストリームがある(複数のファイルがオープンされている)場合にいちいち現在のファイルストリームを切換えなくてもよいので便利です。
これ以外は nl/0 と同じです。"; hash["reference"]=""; hash["sample"]="| ?-tell(con,S),write(S,abc),nl(S),write(S,def),nl(S).
abc
def
S = fp_6812
yes"; hash["genre"]="5"; hash["used"]="true"; hash["incident"]="nl/0
tell/2
open/3"; azlist.push(hash); var hash={}; hash["id"]="187"; hash["name"]="skip/1"; hash["common"]=""; hash["format"]="skip(+N)"; hash["argument"]="N:検索したい文字のキャラクタ(ASCII)又は漢字コード"; hash["text"]="現在の入力ストリームの現在のファイルポインタの指し示す位置からファイルの最後尾に向ってキャラクタ(ASCII)又は漢字コードがNの文字を検索します。
そして該当の文字が見つかった場合はファイルポインタをその文字の次の文字まで移動させます。
そして、を越えると(該当の文字が見つかった場合)はエラー(End of file encountered)になります。
次のPrologプログラムと等価です。
skip(N) :- nonver(N),repeat,get0(N).

次の点に注意が必要です。
・Nの値が31の場合
対象の出力ストリームが「edit」(エディタバッファ)の場合は(31を改行コードとして使っているので)そのまま31を検索します。
それ以外のファイルの場合は改行文字コードの文字列を検索します。

・漢字モードがoffの場合(エディタを除く)
Nを2進数表現したときの下位8桁(1バイト)のみをキャラクターコードと見なして、該当の文字を検索します。(Prolog-KABAの get0/1 と同じになります)

・漢字モードがonの場合(エディタを除く)
まず、検索を始める前に次のようにNを調べてどの文字を検索するかを判断します。

Nを2進数表現したときに文字コードと見なした時、該当の漢字コードがあればその多バイト(全角)文字の検索を開始します。
漢字コードとして該当の文字がなければ下位8桁(1バイト)のみを文字コードと見なして、そのキャラクターコードの文字の検索を開始します。"; hash["reference"]=""; hash["sample"]="| ?-tell(test),write(abc),nl,write(def),nl,told.
yes
| ?-see(test),skip(31),get(X),seen,name(A,[X]).
X = 100,
A = d
yes"; hash["genre"]="5"; hash["used"]="true"; hash["incident"]="see/1
kanji_mode/2"; azlist.push(hash); var hash={}; hash["id"]="188"; hash["name"]="seek/2"; hash["common"]=""; hash["format"]="seek(+S,+N)"; hash["argument"]="
S: 指定ストリームのストリーム値
(see/2,tell/2,tella/2でファイルオープンしたとき第2引数に返された値)
N: 移動先の位置(ファイルの先頭からのバイト数)
"; hash["text"]="Sで指定された入出力ストリームのファイルポインタを任意の位置に移動します。
位置はファイルの先頭からのバイト数をNで指定します。
なお、Nが負の場合は失敗します。

次の点に注意が必要です。
・Sで指定したストリームがファイルポィンタの移動できないデバイス(コンソールやプリンタなど)の場合の実行結果(真偽)は不定です。
・漢字モードが「on」の状態で、移動先が運悪く多バイト(全角)文字の1バイト目以外だった場合はその文字は勿論、以降の文字を get/2 などで正しく読み込めない事があります。"; hash["reference"]=""; hash["sample"]="| ?-tell(test),write(バグ追放),nl,told.
yes
| ?-see(test,S),seek(S,4),get(S,X),seen(S),name(A,[X]).
S = fp_6612,
X = 37575,
A = 追
yes"; hash["genre"]="5"; hash["used"]="true"; hash["incident"]="see/2"; azlist.push(hash); var hash={}; hash["id"]="189"; hash["name"]="current_fp/2"; hash["common"]=""; hash["format"]="current_fp(+S,-I)"; hash["argument"]="
S :指定ストリームのストリーム値
(see/2,tell/2,tella/2 でファイルオープンしたとき第2引数に返された値)
I :現在のファイルポインタの位置(ファイルの先頭からのバイト数)
"; hash["text"]="Sで指定したストリームの現在のファイルポインタの位置をIにユニファイします。
ファイルポインタがファイルの先頭にある場合は0をユニファイします。"; hash["reference"]=""; hash["sample"]="| ?-tell(test),write(バグ追放),nl,told.
yes
| ?-see(test,S),current_fp(S,N1),seek(S,4),current_fp(S,N2),get(S,X),
current_fp(S,N3),seen(S),name(A,[X]).
S = fp_6612,
N1 = 0,
N2 = 4,
X = 37575,
N3 = 6,
A = 追
yes"; hash["genre"]="5"; hash["used"]="true"; hash["incident"]="see/2
seek/2
get/2"; azlist.push(hash); var hash={}; hash["id"]="190"; hash["name"]="d_keyback/1"; hash["common"]=""; hash["format"]="d_keyback(+N・L)"; hash["argument"]="N・L:挿入したい文字のキャラクタ(ASCII)又は漢字コード、又はそれらを要素とするリスト(ストリング)"; hash["text"]="AZ-Prolog内部に持っているキーバッファに文字又は文字列を挿入します。
その結果、キーボードから入力したのと同じ状態になります。
この値は ttyget/1 d_keyin/1 又は現在のストリームが「user」「con」の時のread/1 get/1 などの入力述語で取り出すことが出来ます。
N又はLの要素は16ビットの整数値を越えない範囲ならば(例え該当の文字コードがなくても特に制限なく挿入されます)、これらの入力述語で取り出す場合に文字コードとして調べられます。

例えばエンドユーザ(Prologプログラムの使用者)にキーボード入力を要請する場合に既定値をあらかじめ表示する時などに使用します。"; hash["reference"]=""; hash["sample"]="nengo(X) :- write('あなたの生れた年号は何ですか'),nl,
write('M:明治T:大正S:昭和H:平成 '),nl,
d_keyback(\"S\"),ttyget(X).

この節を実行すると。
?-nengo(X).
あなたの生れた年号は何ですか
M:明治T:大正S:昭和H:平成
|:S ・・・ と表示されるので昭和生れならば
リターンキーだけ押せばよいし、
X = 83 そうでなければを押して
S を消してから改めて
他の文字を入力してリターンキーだけ押す
yes


この例の様に明らかに殆どの人が答えるであろう値を予め入力しておく事ができます。"; hash["genre"]="6"; hash["used"]="true"; hash["incident"]="ttyget/1
d_keyin/1
read/1"; azlist.push(hash); var hash={}; hash["id"]="191"; hash["name"]="d_keyin/1"; hash["common"]=""; hash["format"]="d_keyin(-I)"; hash["argument"]="I:キーボード入力された文字のキャラクタ(ASCII)又は漢字コードがユニファイされる"; hash["text"]="キーバッファが空の場合にこの述語を実行するとキー入力待ちの状態(プロンプトは表示されない)になります。
そしてどれかのキーが押された時点(漢字の場合は確定した時点)ですぐさまその文字のキャラクタ(ASCII)又は漢字コードをIにユニファイします。
漢字などの多バイト文字の場合はその漢字コードを整数でIにユニファイします。(漢字モードとは無関係)
(Prolog-KABA では多バイト(全角)文字の場合でも初めの1バイトのみユニファイする)

日本語FEPを使用することによって複数の文字を入力できますが入力対象は先頭の一文字だけで、残りは無視されます。"; hash["reference"]=""; hash["sample"]="| ?-d_keyin(X). <== これを入力するとキー入力待ちの状態になる。
X = 97 「a」のキーを押しただけでコードが返される。
yes"; hash["genre"]="6"; hash["used"]="true"; hash["incident"]="ttyget/1
d_keylength/1"; azlist.push(hash); var hash={}; hash["id"]="192"; hash["name"]="d_keylength/1"; hash["common"]=""; hash["format"]="d_keylengh(-I)"; hash["argument"]="I:現在キーバッファにある文字数がユニファイされる"; hash["text"]="現在、キーバッファにある文字の数を取得します。
漢字などの多バイト文字も1文字として数えます。(漢字モードとは無関係)

主にキーが押されたか否かを判定するのに用います。
つまり、d_keylength(0) が失敗すればキーが押されたと判断し、成功すれば押されていないと判断します。"; hash["reference"]=""; hash["sample"]="input(K) :- repeat,input_sub(K).
input_sub(K) :- \+ d_keylength(0),d_keyin(K).
input_sub(_).
キーが押されるまでrepeat/0、input_sub間でループします。
もし、キーが押されたらそのキャラクタコードをinput_subの第1引数にユニファイします。
"; hash["genre"]="6"; hash["used"]="true"; hash["incident"]="d_keyin/1
\+ /fy"; azlist.push(hash); var hash={}; hash["id"]="193"; hash["name"]="d_keypeek/1"; hash["common"]=""; hash["format"]="d_keypeek(-I)"; hash["argument"]="I:現在、キーバッファにある先頭文字のキャラクタ(ASCII)又は漢字コードがユニファイされる"; hash["text"]="現在、キーバッファにある先頭(最初に入力した)文字のキャラクタ(ASCII)又は漢字コードがIにユニファイされます。
d_keyin/1 との違いはキーバッファから取り出すのではなく参照するだけで、実行後もキーバッファの内容は変化しません。
その他は d_keyin/1 と同じです。"; hash["reference"]=""; hash["sample"]="?-d_keyback(97),d_keypeek(X),d_keypeek(Y),d_keyin(Z).
X = 97,
Y = 97,
Z = 97
yes
キーバッファの文字をd_keypeek/1で何度参照しても変わりません。"; hash["genre"]="6"; hash["used"]="true"; hash["incident"]="d_keyin/1"; azlist.push(hash); var hash={}; hash["id"]="194"; hash["name"]="ttyget/1"; hash["common"]=""; hash["format"]="ttyget(-I)"; hash["argument"]="I:キーボード入力された文字のキャラクタ(ASCII)又は漢字コードがユニファイされる"; hash["text"]="現在のストリームが「user」か「con」の時の get/1 と同じです。
また、ほぼ、d_keyin/1 と同じですが次の点が異なります。

・画面に現在のプロンプトが出る。入力した文字もエコーバックされる。
・文字を入力後リターンキーを押す必要がある。
・キーバッファに予め文字が貯まっていた場合は、まずその文字を画面にエコーバックし、リターンキーを押すまで受け付けない。
・キーバッファに予め複数の文字が貯まっていた場合は、先頭の一文字だけを取り出して残りの文字は放棄する
(キーバッファをクリアする)
・キャラクタコードが32以下の文字を入力しても受け付けない。"; hash["reference"]=""; hash["sample"]="?-d_keyback("abc"),ttyget(X),d_keylength(N).
|:abc
X = 97,
N = 0

キーバッファに予め文字("abc")が挿入されていたので、
現在のプロンプトに続けてその文字がエコーバックされ、
リターンキーを押すと先頭の文字のコードが
X にユニファイされたあとキーバッファがクリアされたので
N には0が返される。
"; hash["genre"]="6"; hash["used"]="true"; hash["incident"]="get/1
d_keyin/1"; azlist.push(hash); var hash={}; hash["id"]="195"; hash["name"]="ttyget0/1"; hash["common"]=""; hash["format"]="ttyget0(-I)"; hash["argument"]="I:キーボード入力された文字のキャラクタ(ASCII)又は漢字コードがユニファイされる"; hash["text"]="現在のストリームが「user」か「con」の時の get0/1 と同じです。

また、ほぼ ttyget/1 と同じですが、空白・の入力が許されます(それぞれのコードがIにユニファイされます。)。
これにより空入力(リターンキーだけを押す)も受け付けられます。
この場合、が31に変換されてIにユニファイされます。
これ以外の32未満のコードも読み込まれます。"; hash["reference"]=""; hash["sample"]="| ?-ttyget0(X).
|:
X = 31
yes
| ?-"; hash["genre"]="6"; hash["used"]="true"; hash["incident"]="ttyget/1
get0/1"; azlist.push(hash); var hash={}; hash["id"]="196"; hash["name"]="ttyput/1"; hash["common"]=""; hash["format"]="ttyput(+N)"; hash["argument"]="N:コンソール画面への出力したい文字のキャラクタ(ASCII)又は漢字コード"; hash["text"]="現在の出力ストリームが「user」か「con」の時の put/1 と同じです。

まず、Nを2進数表現したとき漢字コードと見なし、該当の文字があればその多バイト(全角)文字を出力します。
もし、該当の多バイト(全角)文字がなければ下位8桁(1バイト)のみをキャラクターコードと見なし、該当の文字を出力します。

Nが31のときは画面にコードを出力します(ttynl/0 と同じ)

・漢字モードはロギングにのみ関係します。
漢字モード「on」の場合はこの ttyput/1 でコンソールに出力された1バイト文字・多バイト(全角)文字共にログファイルにも出力されます。
これに対して漢字モード「off」の場合はこの ttyput/1 でコンソールに出力された1バイト文字はログファイルにも出力されますが、多バイト(全角)文字がコンソールに出力された場合にはログファイルには出力されません。(Prolog-KABAと同じ)"; hash["reference"]=""; hash["sample"]="| ?-ttyput(35519),ttyput(36506),ttynl.
漢字
yes"; hash["genre"]="6"; hash["used"]="true"; hash["incident"]="put/1
ttynl/0"; azlist.push(hash); var hash={}; hash["id"]="197"; hash["name"]="ttynl/0"; hash["common"]=""; hash["format"]="ttynl"; hash["argument"]="なし"; hash["text"]="コンソール画面に対して改行・復帰コードを送ります。
その結果、キャラクタカーソルが現在の位置のすぐ下の行の先頭に移動します。"; hash["reference"]=""; hash["sample"]="| ?-ttynl,ttynl.


yes

2回改行されて yes が表示されます。"; hash["genre"]="6"; hash["used"]="true"; hash["incident"]="nl/0
d_cursor/2"; azlist.push(hash); var hash={}; hash["id"]="198"; hash["name"]="ttyskip/1"; hash["common"]=""; hash["format"]="ttyskip(+N)"; hash["argument"]="N:指定文字のキャラクタ(ASCII)又は漢字コード
"; hash["text"]="Nをキャラクタ(ASCII)又は漢字コードとする文字列が入力されるまで読み飛ばします。
次のPrologプログラムと等価です。
skip(N) :- nonver(N),repeat,ttyget0(N)."; hash["reference"]=""; hash["sample"]="| ?-ttyskip(99). <== 小文字の「c」を入力するまで読み飛ばします。(無視する)
|:a
|:b
|:c
yes"; hash["genre"]="6"; hash["used"]="true"; hash["incident"]="ttyget0/1"; azlist.push(hash); var hash={}; hash["id"]="199"; hash["name"]="d_screen/2"; hash["common"]=""; hash["format"]="d_screen(-I1,-I2)"; hash["argument"]="I1:コンソール画面の桁(カラム)数がユニファイされる
I2:コンソール画面の行数がユニファイされる"; hash["text"]="使用しているコンソール画面の行桁数を取得します。
(d_scroll/2 でスクロール行数を制限したとしても無関係です)

※スタンドアロン実行プログラムからこの述語を使用する場合、コンパイルオプション/curses を指定してコンパイルする必要があります。"; hash["reference"]=""; hash["sample"]="| ?-d_screen(X,Y).
X = 80,
Y = 24
yes
"; hash["genre"]="7"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="200"; hash["name"]="d_clear/0"; hash["common"]=""; hash["format"]="d_clear"; hash["argument"]="なし"; hash["text"]="テキスト画面を全て消去し、キャラクタカーソルを左上のホームポジション(第1桁、第1行)に戻します。
システムによってはグラフィクス画面も同時に消去される物もあります。

※スタンドアロン実行プログラムからこの述語を使用する場合、コンパイルオプション/curses を指定してコンパイルする必要があります。"; hash["reference"]=""; hash["sample"]=""; hash["genre"]="7"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="201"; hash["name"]="d_cleol/0"; hash["common"]=""; hash["format"]="d_cleol"; hash["argument"]="なし"; hash["text"]="現在のカーソル位置から、その行の終端までを消去します。

※スタンドアロン実行プログラムからこの述語を使用する場合、
コンパイルオプション/curses を指定してコンパイルする必要があります。"; hash["reference"]=""; hash["sample"]=""; hash["genre"]="7"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="202"; hash["name"]="d_cleos/0"; hash["common"]=""; hash["format"]="d_cleos"; hash["argument"]="なし"; hash["text"]="現在のカーソル位置から、画面の終端(右下)までを消去します。

※スタンドアロン実行プログラムからこの述語を使用する場合、
コンパイルオプション/curses を指定してコンパイルする必要があります。"; hash["reference"]=""; hash["sample"]=""; hash["genre"]="7"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="203"; hash["name"]="d_cursor/1"; hash["common"]=""; hash["format"]="d_cursor(+A)"; hash["argument"]="A:on か off のどちらかを指定
"; hash["text"]="キャラクタカーソルの表示・非表示を切換えます。
on を指定すると表示され、off を指定すると表示されなくなります。

※スタンドアロン実行プログラムからこの述語を使用する場合、
コンパイルオプション/curses を指定してコンパイルする必要があります。"; hash["reference"]=""; hash["sample"]=""; hash["genre"]="7"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="204"; hash["name"]="d_cursor/2"; hash["common"]=""; hash["format"]="d_cursor(+N1,+N2)"; hash["argument"]="N1:移動先の桁(カラム)位置
N2:移動先の行位置"; hash["text"]="キャラクタカーソルを任意の位置に移動します。
この後のコンソール画面への文字出力はこの位置から開始されます。
左上のホームポジションの座標は(1,1)とします。

もし、N1かN2のどちらかが0以下の場合は1と、N1かN2のどちらかが画面の大きさを越えた場合はその最大値が指定されたものと見なされます。

※スタンドアロン実行プログラムからこの述語を使用する場合、コンパイルオプション/curses を指定してコンパイルする必要があります。"; hash["reference"]="d_pos/2"; hash["sample"]="コンソール画面が80×24であるとすると
| ?-d_cursor(0,26). ・・・(1,24)に移動します。
| ?-d_cursor(-1,24). ・・・(1,24)に移動します。
| ?-d_cursor(91,26). ・・・(80,24)に移動します。
"; hash["genre"]="7"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="205"; hash["name"]="d_scroll/2"; hash["common"]=""; hash["format"]="d_scroll(-I1,+I2)"; hash["argument"]="I1:変更前のスクロール最上行がユニファイされる
I2:変更後のスクロール最上行を指定する"; hash["text"]="画面スクロールする行数を変更します。
ただし、指定方法は行数ではなく、スクロールする最上行を指定します。
つまり、1を指定すると画面全体がスクロールの対象となります。
システム立上げ後の既定値は1です。

※スタンドアロン実行プログラムからこの述語を使用する場合、コンパイルオプション/curses を指定してコンパイルする必要があります。"; hash["reference"]="d_pos/2"; hash["sample"]="コンソール画面の大きさが80×24であるとすると
| ?-d_scroll(_,24). ・・・最下行だけがスクロールします。
_ = 1
yes
| ?-d_scroll(_,1). ・・・画面全体がスクロールします。
_ = 24
yes
"; hash["genre"]="7"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="206"; hash["name"]="d_pos/2"; hash["common"]=""; hash["format"]="d_pos(-I1,-I2)"; hash["argument"]="I1:現在、カーソルのある桁がユニファイされる
I2:現在、カーソルのある行がユニファイされる"; hash["text"]="現在のカーソル位置を取得します。
I1に横方向左端からの桁数がI2に縦方向上橋からの行数をユニファイします。
左上角のホームポジションの座標は(1,1)とします。

※スタンドアロン実行プログラムからこの述語を使用する場合、コンパイルオプション/curses を指定してコンパイルする必要があります。"; hash["reference"]=""; hash["sample"]="| ?-d_cursor(3,5),write(abc),d_pos(X,Y).

abc
X = 6,
Y = 5
yes


まず、d_cursor/2でカーソルを5行目の3桁目に持っていき、
そこから3文字書いたのでカーソルが5行目の6桁目に行ったことを示しています。
漢字などの2バイト文字を書いた場合は文字数の倍の桁数だけカーソルが移動することになります。
"; hash["genre"]="7"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="207"; hash["name"]="d_redisp/0"; hash["common"]=""; hash["format"]="d_redisp"; hash["argument"]="なし"; hash["text"]="コンソール画面をシステム内部に記憶している内容で再猫画します。

※スタンドアロン実行プログラムからこの述語を使用する場合、コンパイルオプション/curses を指定してコンパイルする必要があります。"; hash["reference"]=""; hash["sample"]="| call_cmd(cmd):- system(cmd),write('type any key fo return'),
         d_keyin(_),d_redisp.

OSコマンドの実行による出力で乱れた画面を元に戻します。"; hash["genre"]="7"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="208"; hash["name"]="prompt/2"; hash["common"]=""; hash["format"]="prompt(-A1,+A2)"; hash["argument"]="A1:変更前の旧プロンプトがユニファイされる
A2:変更後の新プロンプトを指定する"; hash["text"]="現在の入力ストリームが「user」か「con」の場合の read/1,get/1,get0/1,get1/1
又は「user」か「con」を指定したときの read/2,get/2,get0/2,get1/2 又は
ttyget/1,ttyget0/1 などでキーボードから入力する場合の現在のプロンプト(入力促進記号)の文字列(アトム)を変更します。

アトムとして許されない文字列の場合はシングルクォートで囲って下さい。
この囲ったシングルクォートは表示されません。

デフォルトは「|:」です。"; hash["reference"]=""; hash["sample"]="| ?-prompt(_,'Please input >').
_ = |:
yes
| ?-ttyget(X).
Please input >a
X = 97
yes"; hash["genre"]="7"; hash["used"]="true"; hash["incident"]="read/1
read/2
get/1
get0/1
get1/1



get/2
get0/2
get1/2



ttyget/1
ttyget0/1"; azlist.push(hash); var hash={}; hash["id"]="209"; hash["name"]="copy0/0"; hash["common"]=""; hash["format"]="copy0"; hash["argument"]="なし"; hash["text"]="現在の入力ストリームの内容を、現在の出力ストリームにコピーします。
ただし、キャラクタコード31の文字は改行文字に変換されます。
コピー終了後も入出力どちらのファイルもクローズされませんので、seen/0,told/0 を実行してそれぞれのファイルをクローズする必要があります。
エディタバッファの内容及びコンソール入力をディスク上のファイル又はプリンタにコピーする場合に使います。
その他の場合は次の copy1/0 を使います。

次の点に注意が必要です。
・エディタバッファはディスク上のファイルと異なり、このcopy0/0 でエディタバッファに書込むとその時点の漢字モードによって以降の文字の扱いが決定されます。
つまり、漢字モード「on」で copy0/0でエディタバッファに書込んだ文字列は以降漢字モードに関係なく多バイト(全角)文字は1バイトずつ分けて扱います。
逆に漢字モード「off」で copy0/0 でエディタバッファに書込んだ文字列は以降漢字モードに関係なく多バイト(全角)文字は1バイトずつ分けて扱います。

これは、エディタバッファから get系の述語で読み込む場合、又はドットの移動時などの文字の扱いがその時の漢字モードとは無関係に、書込む時点の漢字モードによって決定される事を意味しています。

・漢字モードはロギングにも関係します。
漢字モード「on」かつ現在の出力ストリームが「con」「user」の場合は1バイト文字・多バイト(全角)文字共にログファイルにも出力されます。
これに対して漢字モード「off」かつ現在の出力ストリームが「con」「user」の場合は1バイト文字はログファイルにも出力されますが、多バイト(全角)文字がコンソールに出力された場合にはログファイルには出力されません。
(Prolog-KABAと同じ)"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]="abcdというファイルの中身が次の場合
abcd
efgh
ijkl

| ?-see(abcd),tell(test),copy0,seen,told.
yes
| ?-

testのファイルの内容は次のようになります。
abcd
efgh
ijkl"; hash["genre"]="9"; hash["used"]="true"; hash["incident"]="see/1
tell/1
seen/0
told/0
copy1/0"; azlist.push(hash); var hash={}; hash["id"]="210"; hash["name"]="copy1/0"; hash["common"]=""; hash["format"]="copy1"; hash["argument"]="なし"; hash["text"]="現在の入力ストリームの内容を、現在の出力ストリームにそのままコピーします。
copy0/0 との違いはキャラクタコード31の文字を改行文字に変換しないことです。
従って、エディタバッファの内容及びコンソール入力をディスク上のファイル又はプリンタにコピーする場合には使えません。
その場合は copy0/0 を使って下さい。

これ以外は copy0/0 と同じです。"; hash["reference"]="「(操)第8章スクリーンエディタ(AzEdit)」
"; hash["sample"]="エディタバッファの内容が次の通りで、現在のドットが先頭、マークが最後にあるとすると
abcd
efgh
ijkl
--------------------
| ?-see(edit),tell(test),copy1,seen,told.
yes
| ?-halt.
Exit from Prolog

[A:\]type test
abcd
  efgh        キャラクタコード31の文字を改行文字コード
    ijkl      に変換しないためこういう結果になります。

[A:\]"; hash["genre"]="9"; hash["used"]="true"; hash["incident"]="see/1
tell/1
seen/0
told/0
copy0/0"; azlist.push(hash); var hash={}; hash["id"]="211"; hash["name"]="echo/2"; hash["common"]=""; hash["format"]="echo(-A1,+A2)"; hash["argument"]="A1:実行前の状態が「on」か「off」でユニファイされる
A2:実行後の状態を「on」か「off」で指定する"; hash["text"]="実行後の状態を「on」を指定すると、ファイルからコンサルト又はリコンサルトするときのプログラム、又は read,get,copy 系の述語で入力ストリームから入力した内容をコンソール画面にエコーバック(表示)します。
実行後の状態を「off」を指定すると、エコーバックされません。

初期値は「off」です。"; hash["reference"]=""; hash["sample"]="| ?-echo(_,on).
_ = off
yes
| ?-[-'proedit.pl'].

プログラムが表示されます。

yes"; hash["genre"]="9"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="212"; hash["name"]="log/0"; hash["common"]=""; hash["format"]="log"; hash["argument"]="なし"; hash["text"]="コンソール出力をそのまま同時に'prolog.log'というファイルに出力します。
デバッグ中のトレース情報を遡って見るときなどに有効です。
nolog/0 を実行するとこのファイル出力を中止し、ファイルをクローズします。
従って、このファイルを参照するには nolog/0 を実行する必要があります。

追加モードでオープンしますから既に'prolog.log'というファイルが存在する場合にはその内容の最後に追加されます。

任意のファイルに出力するには log/1 を使います。"; hash["reference"]="「(操)6.3デバッグモード」
"; hash["sample"]="| ?-log.
yes
| ?-trace.
yes
debug mode on
||?-member(c,[a,b,c,d]).
[1] 0 Try : member(c,[a,b,c,d]) ?
<< BUILTIN CALL >>
[1] 0 Succ : member(c,[a,b,c,d])
yes
LOOP = 1
||?-nodebug.
[1] 0 Try : nodebug ?
<< BUILTIN CALL >>
yes
debug mode off
| ?-nolog.
yes
| ?-


prolog.logファイルの内容

yes
| ?-trace.
yes
debug mode on
||?-member(c,[a,b,c,d]).
[1] 0 Try : member(c,[a,b,c,d]) ?
<< BUILTIN CALL >>
[1] 0 Succ : member(c,[a,b,c,d])
yes
LOOP = 1
||?-nodebug.
[1] 0 Try : nodebug ?
<< BUILTIN CALL >>
yes
debug mode off
| ?-nolog."; hash["genre"]="9"; hash["used"]="true"; hash["incident"]="log/1 (1)
nolog/0"; azlist.push(hash); var hash={}; hash["id"]="213"; hash["name"]="log/1 (1)"; hash["common"]=""; hash["format"]="log(+A)"; hash["argument"]="A:出力ファイル名を指定する"; hash["text"]="Aでファイル名を指定出来る事の他は log/0 と同じです。
つまり、log/0 は log('prolog.log') とまったく同じです。"; hash["reference"]=""; hash["sample"]="| ?-log('test.log').
yes
| ?-trace.
yes
debug mode on
||?-member(c,[a,b,c,d]).
[1] 0 Try : member(c,[a,b,c,d]) ?
<< BUILTIN CALL >>
[1] 0 Succ : member(c,[a,b,c,d])
yes
LOOP = 2
||?-nodebug.
[1] 0 Try : nodebug ?
<< BUILTIN CALL >>
yes
debug mode off
| ?-nolog.
yes


test.logファイルの内容

yes
| ?-trace.
yes
debug mode on
||?-member(c,[a,b,c,d]).
[1] 0 Try : member(c,[a,b,c,d]) ?
<< BUILTIN CALL >>
[1] 0 Succ : member(c,[a,b,c,d])
yes
LOOP = 2
||?-nodebug.
[1] 0 Try : nodebug ?
<< BUILTIN CALL >>
yes
debug mode off
| ?-nolog."; hash["genre"]="9"; hash["used"]="true"; hash["incident"]="log/0
nolog/0"; azlist.push(hash); var hash={}; hash["id"]="214"; hash["name"]="nolog/0"; hash["common"]=""; hash["format"]="nolog"; hash["argument"]="なし"; hash["text"]="log/0,log/1 で開始されたログ・ファイルへの出力を中止し、ファイルをクローズします。

halt/0 halt/1 でPrologを終了する前にログ・ファイルを参照する場合は必ずこの nolog/0 を実行して下さい。"; hash["reference"]=""; hash["sample"]="省略(log/0,log/1 の実行例を参照して下さい)"; hash["genre"]="9"; hash["used"]="true"; hash["incident"]="log/0
log/1 (1)"; azlist.push(hash); var hash={}; hash["id"]="215"; hash["name"]="logging/1"; hash["common"]=""; hash["format"]="logging(-A)"; hash["argument"]="A1:ファイル名"; hash["text"]="現在のログファイル名をユニファイします。
ロギングしていないときは nul が返ります。"; hash["reference"]=""; hash["sample"]=""; hash["genre"]="9"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="216"; hash["name"]="rename/2"; hash["common"]=""; hash["format"]="rename(+A1,+A2)"; hash["argument"]="
A1 :ファイル名の変更又は削除したいファイルのファイル名(旧ファイル名)を指定する
A2 :変更後のファイル名(新ファイル名)を指定する
A1のファイルを削除する場合は空リスト「[]」とする
"; hash["text"]="ディスク上にあるファイルのファイル名を変更、又は削除します。
A1で指定するファイル名をA2で指定するファイル名に変更します。
A2を空リスト「[]」にするとA1で指定するファイルが削除されます。"; hash["reference"]=""; hash["sample"]="| ?-rename('昭和.DAT','平成.DAT').
yes
'昭和.DAT'というファイルを'平成.DAT'という名前に変更します。

| ?-rename('昭和.PL',[]).
yes
'昭和.PL'というファイルを削除します。"; hash["genre"]="9"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="217"; hash["name"]="fileerrors/2"; hash["common"]=""; hash["format"]="fileerrors(-A1,+A2)"; hash["argument"]="A1:変更前の旧状態、「error」か「fail」がユニファイされる
A2:変更後の新状態、「error」か「fail」を指定する"; hash["text"]="入出力関係の述語が何等かのエラーを起こした場合、エラーを発生させて全体の実行を中断するか、あるいはその述語の実行のみを失敗させるかのどちらの処理をさせるかを変更します。
全体の実行を中断させる場合は「error」、
その述語の実行のみを失敗させる場合は「fail」を指定します。
現在の状態がA1にユニファイされた後、A2で指定した新状態に変わります。

初期値は error です。"; hash["reference"]="「(操)5.10.2実行時のエラー」
"; hash["sample"]="'test.dat'というファイルが存在しなかった場合
| ?-see('test.dat').
Can't see the file ---- Backtrace
see('test.dat') | ?-
| ?-fileerrors(_,fail).
_ = error
yes
| ?-see('test.dat').
no
| ?-fileerrors(_,error).
_ = fail
yes
| ?-see('test.dat').
Can't see the file ---- Backtrace
see('test.dat') | ?-"; hash["genre"]="9"; hash["used"]="true"; hash["incident"]="fileerrors/0
nofileerrors/0"; azlist.push(hash); var hash={}; hash["id"]="218"; hash["name"]="fileerrors/0"; hash["common"]=""; hash["format"]="fileerrors"; hash["argument"]="なし"; hash["text"]="入出力関係の述語が何等かのエラーを起こした場合、エラーを発生させて全体の実行を中断するようにします。
fileerrors(_,error) とまったく同等です。"; hash["reference"]="「(操)5.10.2実行時のエラー」
"; hash["sample"]="'test.dat'というファイルが存在しなかった場合
| ?-see('test.dat').
Can't see the file ---- Backtrace
see('test.dat') ?-
| ?-fileerrors(_,fail).
_ = error
yes
| ?-see('test.dat').
no
| ?-fileerrors.
yes
| ?-see('test.dat').
Can't see the file ---- Backtrace
see('test.dat') ?- "; hash["genre"]="9"; hash["used"]="true"; hash["incident"]="fileerrors/2"; azlist.push(hash); var hash={}; hash["id"]="219"; hash["name"]="nofileerrors/0"; hash["common"]=""; hash["format"]="nofileerrors"; hash["argument"]="なし"; hash["text"]="入出力関係の述語が何等かのエラーを起こした場合、その述語の実行のみを失敗させるようにします。
fileerrors(_,fail) とまったく同等です。"; hash["reference"]="「(操)5.10.2実行時のエラー」
"; hash["sample"]="'test.dat'というファイルが存在しなかった場合
| ?-see('test.dat').
Can't see the file ---- Backtrace
see('test.dat') ?-
| ?-nofileerrors.
yes
| ?-see('test.dat').
no
| ?-fileerrors(_,error).
_ = fail
yes
| ?-see('test.dat').
Can't see the file ---- Backtrace
see('test.dat') ?-"; hash["genre"]="9"; hash["used"]="true"; hash["incident"]="fileerrors/2"; azlist.push(hash); var hash={}; hash["id"]="220"; hash["name"]="d_create/2"; hash["common"]=""; hash["format"]="d_create(+A,+L)"; hash["argument"]="A:ランダムファイル名
L:ランダムファイル構造
構造は [フィールド名,フィールド長]なるリストか又はフィールドが複数ある場合はこのリストの並びのリストを作る

★フィールド名は32バイト以内のアトムの並びリスト(要素は50個まで)
★フィールド長はバイト単位で指定
ただし、フィールド長の合計(レコード長)は8KBまで

以上の条件に合わない場合はエラー(Illegal argument supplied)となります。"; hash["text"]="Aで指定するファイル名、Lで指定する構造を持つランダムファイルを新た作成して入出力オープンします。したがって、改めて d_open/1 でオープンする必要はありません。

このランダムファイルはAZ-Prolog独自のフォーマットになっていますので他のデータベースファイルとは互換性はありません。
(従って、Prolog-KABA・
またはWINGで作成したランダムファイル(dBASEⅡ互換)とも互換性はありません)

d_write/3 や d_writeq/3 でデータを書込んだ後は d_close/1でファイルクローズをして下さい。

ここで作成したランダムファイルにデータを追加・修正する場合は d_open/1 でファイルオープンして下さい。
再び同じファイル名で d_create を実行するとデータが全て消されてしまいます。

本システムのランダムファイル名は拡張子などに特に制約はありません。
本マニュアルでは分りやすくするため、ランダムファイル名の拡張子は「.db」とします。"; hash["reference"]=""; hash["sample"]="ファイル名:address.DB
構造:フィールド名フィールド長
氏名 12
〒番号 6
住所1 20
住所2 20
TEL 20

のランダムファイルを作ります。


| ?-d_create('address.db',
[[氏名,12],[〒番号,6],[住所1,20],[住所2,20],[TEL,20]]).
yes"; hash["genre"]="8"; hash["used"]="true"; hash["incident"]="d_open/1
d_close/1
d_write/3
d_writeq/3"; azlist.push(hash); var hash={}; hash["id"]="221"; hash["name"]="d_open/1"; hash["common"]=""; hash["format"]="d_open(+A)"; hash["argument"]="A:オープンするファイル名を指定する"; hash["text"]="Aで指定されるランダムファイルをファイル(読み出し・書込み両用)として入出力オープンします。

Aで指定されるファイルは既に d_create/2 で作られていなければなりません。
従って、この d_open/1 は既存のランダムファイルにデータを追加したり、修正する場合に使います。
オープンしたランダムファイルは d_close/1 でクローズします。"; hash["reference"]=""; hash["sample"]="| ?-d_open('address.db'),d_write('address.db',1,[[氏名,長野一太郎]]),
d_close('address.db').
yes
'address.db'というランダムファイルの、一番目のレコードの、
氏名フィールドに「長野一太郎」なる値を書込みます。


| ?-d_open('address.db'),d_seek('address.db',_,0),
d_read('address.db',[氏名],X),d_close('address.db').
_0=0,
X = [[氏名,長野一太郎]]
yes
'address.db'というランダムファイルの、一番目のレコードの、
氏名フィールドから「長野一太郎」なる値を読み込みます。
"; hash["genre"]="8"; hash["used"]="true"; hash["incident"]="d_create/2
d_close/1"; azlist.push(hash); var hash={}; hash["id"]="222"; hash["name"]="d_opening/1"; hash["common"]=""; hash["format"]="d_opening(-L)"; hash["argument"]="L:現在、オープンされているランダムファイル名の並びのリストがユニファイされる"; hash["text"]="現在、オープンされているランダムファイル名を取得します。"; hash["reference"]=""; hash["sample"]="| ?-d_open('test1.db').
yes
| ?-d_open('test2.db').
yes
| ?-d_opening(X).
X = [test1.db,test2.db]
yes"; hash["genre"]="8"; hash["used"]="true"; hash["incident"]="d_create/2
d_open/1"; azlist.push(hash); var hash={}; hash["id"]="223"; hash["name"]="d_close/1"; hash["common"]=""; hash["format"]="d_close(+A)"; hash["argument"]="A:クローズするファイル名を指定する"; hash["text"]="d_create/2,d_open/1 でオープンされたランダムファイルをクローズします。"; hash["reference"]=""; hash["sample"]="| ?-d_open('address.db'),d_write('address.db',1,[[氏名,長野一太郎]]),
d_close('address.db').
yes

'address.db'というランダムファイルの、一番目のレコードの、氏名フィールドに「長野一太郎」なる値を書込みます。"; hash["genre"]="8"; hash["used"]="true"; hash["incident"]="d_create/2
d_open/1"; azlist.push(hash); var hash={}; hash["id"]="224"; hash["name"]="d_write/3"; hash["common"]=""; hash["format"]="d_write(+A,+I,+L)"; hash["argument"]="
A :書込むファイル名
必ず、予め d_open/1 で入出力オープンしているファイルであること
I :書込むレコード番号
L :[フィールド名,書込む項]なるリストか又はそのリスト
"; hash["text"]="d_create/2,d_open/1 でオープンされているランダムファイルにデータ(項)を書込みます。
ただし、Tがシングルクォートで囲ったアトムの場合、またはTがシングルクォートで囲ったアトムが含まれる複合項の場合、そのシングルクォートがばすされて書込まれてしまいます。
従って、シングルクォートがはずされると項として許されない(括弧の対応がとれてないなど)場合は書込まれますが、d_read/2で読込む時点でエラー(Syntax error)となり読込む事は出来ませんので注意が必要です。
この場合は次の d_writeq/3 を使うとシングルクォートがはずされずにアトムのまま書込まれる為にd_read/2 でエラー(Syntax error)にならずに読込む事が出来ます。
また、書込もうとするフィールドに既にデータがある場合は上書されます。"; hash["reference"]=""; hash["sample"]="| ?-d_open('address.db'),
d_write('address.db',1,
[[氏名,長野一太郎],
[〒番号,612],
[住所1,京都市伏見区下鳥羽平塚町],
[住所2,20],
[TEL,075-602-7878]]),
d_close('address.db').
yes
‹address.db›ファイルの第1レコードのそれぞれのフィールドにデータを書込みます。

| ?-d_open('address.db'),d_write('address.db',2,[[氏名,長野一太郎]]),
d_close('address.db').
yes
‹address.db›ファイルの第2レコードの氏名フィールドにデータを書込みます。(シングルクォート付)"; hash["genre"]="8"; hash["used"]="true"; hash["incident"]="d_create/2
d_open/1"; azlist.push(hash); var hash={}; hash["id"]="225"; hash["name"]="d_writeq/3"; hash["common"]=""; hash["format"]="d_writeq(+A,+I,+L)"; hash["argument"]="
A :書込むファイル名
必ず、予め d_open/1 で入出力オープンしているファイルであること
I :書込むレコード番号
L :[フィールド名,書込む項]なるリストか又はそのリスト
"; hash["text"]="d_create/2,d_open/1 でオープンされているランダムファイルにデータ(項)を書込みます。
d_write/3 との違いは、d_write/3 が「Tがシングルクォートで囲ったアトムの場合、またはTがシングルクォートで囲ったアトムが含まれる複合項の場合そのにシングルクォートがはずされる」のに対して d_writeq/3 ではそのまま書込まれる点です。
従って、シングルクォートがはずされると項として許されない(括弧の対応がとれてないなど)場合でもアトムのまま書込まれますから、d_read/2 で読む事が出来ます。"; hash["reference"]=""; hash["sample"]="| ?-d_create('test.db',[[a,10]]),d_write('test.db',1,[[a,'a)(b']]),
d_close('test.db').
yes
| ?-d_open('test.db'),d_read('test.db',[a],X),d_close('test.db').
Syntax error ---------
d_read('test.db',1,[a],X) d_open('test.db') ?-
「a)(b」が項として許されない文字列なので、エラー(Syntax error)となります。

| ?-d_open('test.db'),d_writeq('test.db',1,[[a,'a)(b']]),d_close('test.db').
yes
| ?-d_open('test.db'),d_read('test.db',[a],X),d_close('test.db').
X = [[a,a)(b]]
yes
d_writeq/2 で書込むと「a)(b」がアトムのまま書込まれるため、d_read/2で読み込む事が出来ます。"; hash["genre"]="8"; hash["used"]="true"; hash["incident"]="d_write/3
d_create/2
d_open/1"; azlist.push(hash); var hash={}; hash["id"]="226"; hash["name"]="d_read/2"; hash["common"]=""; hash["format"]="d_read(+A,-L)"; hash["argument"]="
A :入力したいファイル名
必ず、予め d_open/1 で入出力オープンしているファイルであること
L :現在のレコードポインタを一つ進めた番号のレコードの全フィールドのデータがユニファイされる
"; hash["text"]="先ず現在のレコードポインタを進めて、その位置のレコード(つまり、現在のレコードポインタの指すレコードの次のレコード)の全フィールドのデータを入力(読み込み)します。
レコードポインタが既に最終レコードを指している場合は失敗します。

レコードポインタとは最後に入力したレコードを指すものです。
従ってレコードポインタの値は最後に入力した(読み込んだ)レコードのレコード番号ということになります。
なお、d_open/1 でオープンした直後はレコードポインタ0レコードを指しています。
つまりレコードポインタの値が0という事です。
これは「最後に0レコードを読み込んだ」事になりますが実際には0レコードはありませんから、「ファイルをオープンしてから未だレコードを一つも読み込んでいない」という事を表します。

また、レコードポインタの現在の値(位置)は d_seek/3 で参照・変更できます。
d_seek/3 を使って、レコードポインタの現在の値(位置)を読み込みたいレコードの番号より一つ若い値に設定することによって目的のレコードをダイレクトに入力する事が出来ます。

この述語は決定性述語ですからバックトラックしてきたとしても、この述語自信は次のレコードを読み込む事はしません。
バックトラックによって動作を繰返したい場合にはこの述語より前に repeat系述語を書いておきます。

指定レコード以降のレコードを次々と入力するPrologプログラムを書くと...

db_read(F,R,D) :- d_seek(F,_,R-1),repeat,db_read(F,D).
db_read(F,D) :- d_read(F,D),!.
db_read(_,_) :- though,!,fail.

のようになります。"; hash["reference"]=""; hash["sample"]="| ?-d_open('address.db'),d_seek('address.db',_,0),d_read('address.db',X),d_close('address.db').

X = [[氏名,長野一太郎],[〒番号,612],[住所1,長野県佐久市大字中込],
[住所2,13-3],[TEL,0422-21-2304]
yes

'address.db'というランダムファイルの、一番目のレコードの、全フィールドから値を読み込みます。"; hash["genre"]="8"; hash["used"]="true"; hash["incident"]="d_create/2
d_seek/3"; azlist.push(hash); var hash={}; hash["id"]="227"; hash["name"]="d_read/3"; hash["common"]=""; hash["format"]="d_read(+A,+L1,-L2)"; hash["argument"]="
A :入力したいファイル名を指定する
L1 :入力したいフィールド名の並びリストを指定する
L2 :該当のデータがユニファイされる
フィールド名を複数指定した場合はその並びの順番に対応したデータのリストがユニファイされる
"; hash["text"]="Aによって指定されたファイルの現在のレコードポンタを一つ前に進めた後、そのレコードのL1で指定されたフィールドのデータを入力(読み込み)します。

フィールド名を指定出来る以外は d_read/2 と同じです。

なお、指定されたフィールド名のどれかが存在しないときは失敗します。"; hash["reference"]=""; hash["sample"]="db_read(F,L,D) :- repeat,db_read(F,L,D).
db_read(F,L,D) :- d_read(F,L,D),!.
db_read(_,_,_) :- though,!,fail.
というプログラムが定義されている時

| ?-d_open('address.db').
yes
| ?-db_read('address.db',[氏名],X).
yes
X = [[氏名,長野一太郎]];
X = [[氏名,長野二太郎]];
X = [[氏名,長野三太郎]]
yes
| ?-d_close('address.db').
yes

'address.db'というランダムファイルの、一番目のレコードの、氏名フィールドから「長野一太郎」「長野二太郎」「長野三太郎」なる値を読み込みました。"; hash["genre"]="8"; hash["used"]="true"; hash["incident"]="d_read/2
d_create/2
d_seek/3"; azlist.push(hash); var hash={}; hash["id"]="228"; hash["name"]="d_seek/3"; hash["common"]=""; hash["format"]="d_seek(+A,-I1,+I2)"; hash["argument"]="
A :ファイル名を指定する
必ず、予め d_open/1 で入出力オープンしているファイルであること
I1 :変更前のレコードポインタの位置がユニファイされる
I2 :変更後のレコードポインタの位置を指定する
(実数の場合は小数点以下が切捨てられる。また、数式も許される)
"; hash["text"]="現在のレコードポインタの位置を取得・変更します。
主に任意のレコードから以降を逐次読み込む場合に先頭のレコードを指定するために使います。
レコードポインタとは最後に入力したレコードを指すものです。
従ってレコードポインタの値は最後に入力した(読み込んだ)レコードのレコード番号ということになります。
なお、d_open/1 でオープンした直後はレコードポインタ0レコードを指しています。
つまりレコードポインタの値が0という事です。これは「最後に0レコードを読み込んだ」事になりますが実際には0レコードはありませんから、「ファイルをオープンしてから未だレコードを一つも読み込んでいない」という事を表します。"; hash["reference"]=""; hash["sample"]="db_read(F,R,L,D) :- d_seek(F,_,R-1),repeat,db_read(F,L,D).
db_read(F,L,D) :- d_read(F,L,D),!.
db_read(_,_,_) :- though,!,fail.
というプログラムが定義されている時
| ?-d_open('address.db'),db_read('address.db',3,[氏名],X).
X = [[氏名,長野三太郎]];
X = [[氏名,長野四太郎]];
X = [[氏名,長野五太郎]]
yes
| ?-d_close('address.db').
yes
d_read/2 d_read/3 はレコード指定をしない場合は現在のレコードポインタの次のレコードを読み込む為、
d_seek/3 の指定は読み込みたいレコードより一つ前を指定しなければなりません。
先頭のレコードから読み込む場合は0を指定します。
"; hash["genre"]="8"; hash["used"]="true"; hash["incident"]="d_read/2
d_read/3"; azlist.push(hash); var hash={}; hash["id"]="229"; hash["name"]="d_record/4"; hash["common"]=""; hash["format"]="d_record(+A,-I1,-I2,-I3)"; hash["argument"]="
A :ファイル名を指定
必ず、予め d_open/1 で入出力オープンしているファイルであること
I1 :指定ファイルの最後に読み込まれたレコード番号(現在のレコードポインタの位置)がユニファイされる
I2 :指定ファイルの最終レコード番号(全レコード数)がユニファイされる
I3 :指定ファイルのレコード長(フィールド長の合計)がユニファイされる
"; hash["text"]="指定ファイルの最後に読み込まれたレコード番号(現在のレコードポインタの位置)
最終レコード番号(全レコード数)、レコード長(フィールド長の合計)を取得できます。"; hash["reference"]=""; hash["sample"]="db_read(F,R,L,D) :- d_seek(F,_,R-1),repeat,db_read(F,L,D).
db_read(F,L,D) :- d_read(F,L,D),!.
db_read(_,_,_) :- though,!,fail.
というプログラムが定義されていて、かつ、'address.db'というファイルが
d_create('address.db',
[[氏名,12],[〒番号,6],[住所1,20],[住所2,20],[TEL,20]]).
で作成・入出力オープンされているものとすると


| ?-d_open('address.db'),db_read('address.db',3,氏名,X).
X = [[氏名,長野三太郎]];
X = [[氏名,長野四太郎]];
X = [[氏名,長野五太郎]]
yes
| ?-d_record('address.db',Rp,Rn,Rl),d_close('address.db').
Rp = 5, <== ファイルポインタは5である(最後に第5レコードを読み出したので)
Rn = 5, <== 5個のレコードがある(最終レコード番号)
Rl = 78 <== レコード長は78である(各フィールド長の合計 12+6+20+20+20= 70)
yes"; hash["genre"]="8"; hash["used"]="true"; hash["incident"]="d_open/1
d_read/2
d_read/3
d_seek/3"; azlist.push(hash); var hash={}; hash["id"]="230"; hash["name"]="d_struct/2"; hash["common"]=""; hash["format"]="d_struct(+A,-L)"; hash["argument"]="
A :ファイル名を指定
必ず、予め d_open/1 で入出力オープンしているファイルであること
I1 :指定ファイルの最後に読み込まれたレコード番号(現在のレコードポインタの位置)がユニファイされる
L :指定ファイルの構造([フィールド名,フィールド長]なるのリストのリスト)がユニファイされる
"; hash["text"]="指定ファイルの構造を[フィールド名,フィールド長]なるリストのリストで取得できます。"; hash["reference"]=""; hash["sample"]="d_create('address.db',
[[氏名,12],[〒番号,6],[住所1,20],[住所2,20],[TEL,20]]).
で作成・入出力オープンされているものとすると
| ?-d_open('address.db'),d_struct('address.db',X),d_close('address.db').
X = [[氏名,12],[〒番号,6],[住所1,20],[住所2,20],[TEL,20]]
yes

つまり、指定ファイルを作った時の d_create/2 の第2引数に指定したリストと同じリストが返されます。"; hash["genre"]="8"; hash["used"]="true"; hash["incident"]="d_open/1
d_read/2
d_read/3
d_seek/3"; azlist.push(hash); var hash={}; hash["id"]="231"; hash["name"]="is /xfx"; hash["common"]="ISO"; hash["format"]="-N1 is +N2"; hash["argument"]="N1:N2を評価した結果(演算の解、実数値又は整数値)がユニファイされる
N2:評価される数式を指定する(それ以外の場合はエラー{Illegal argument supplied}となる)
数式とは数値(整数値又は実数値)、算術演算子、ビット演算子、算術関数
内部状態参照関数のどれか、又はこれらの要素を組合せたものとする"; hash["text"]="N2の数式(算術演算子・算術関数又は内部状態参照関数を含む項)を評価(演算)し、その結果をN1にユニファイします。

整数演算の場合にその結果が、整数の範囲を越える(オーバーフローする)とその値は保証されません。64bit OSの場合、-2^63 ~ 2^63-1までの範囲(19桁)です。

実数演算の場合はその結果が15桁を越えると仮数と指数に分けて表現されます。
64bit OSの場合、e-324 ~ e+308までの範囲です。
また、この例の様に数式の中に関数を書く事も出来ます。
数式に使える算術演算子・算術関数・内部状態参照関数には次のものがあります。

《算術演算子》
「+(符号)」「-(符号)」「+」「-」「*」「/」「^」「/\\」
「and」「\\/」「or」「\\」「<<」「>>」「mod」「rem」
「**」「//」

《算術関数》
「exp」「log」「log10」「sqrt」「floor」「sin」
「cos」「tan」「asin」「acos」「atan」「float」
「integer」「abs」「sign」「gcd」「min」「max」
「ceiling」「round」「truncate」「float_integer_part」
「float_fractional_part」「pi」「random」

《内部状態参照関数》
「cputime」「breaklevel」
「heapused」「heapmax」
「globalused」「globalmax」
「localused」「localmax」
「trailused」「trailmax」
「atomused」「atommax」

内部状態参照関数とは処理系内部の数値情報(ブレークレベルや各スタックの使用量など)を取得する関数です。

なお、演算の優先順位は数学規則に従います。
また、括弧「( )」内は優先されますから、数式中で優先させたい部分を括弧で囲っておけば間違いありません。
ただし、数式中で括弧として認められるのは「( )」だけで、数学で使われる「{ }」や「[ ]」は使えません。"; hash["reference"]="「(述)3.5.2算術演算子」「(述)3.5.3ビット演算子」
「(述)3.5.4算術関数」の各演算子・関数。"; hash["sample"]=""; hash["genre"]="10"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="232"; hash["name"]="s_child/5"; hash["common"]=""; hash["format"]="s_child(+A,+L,?S1,?S2,-I)"; hash["argument"]="
A :子プロセスで実行させるプログラム名を指定する
L :上のプログラムの起動時の引数ならびリスト
S1 :子プロセスの stdin ストリーム
S2 :子プロセスの stdout ストリーム
I :子プロセスのプロセスID
"; hash["text"]="S1(S2)として see/2(tell/2)等でオープンしたストリームを指定するとそれが子プロセスの標準入出力として与えられる。
未代入変数が与えられた場合にはパイプをオープンしてその書き込み側 (読み出し側) のストリームをユニファイする。"; hash["reference"]=""; hash["sample"]=" ●Linuxでの実行例

| ?-s_child(pwd,[],I,O,PID),repeat,get0(O,C),name(A,[C]),    
  write(A),C =:=4,told(I),seen(O),s_kill(PID,15),
s_wait(PID,X,Y).
/home/sofnec/prolog

I = fp_294ef10,
O = fp_294f1b0,
PID = 20322,
C = 4,
A = ,
X = 0,
Y = 15
yes


●Windowsでの実行例
 (s_childで実行するプログラムにより結果が異なります)


| ?-s_child(cmd,['/K','cd'],I,O,PID),s_sleep(1000),s_kill(PID,9),
s_wait(PID,_,_),repeat,get0(O,C),name(A,[C]),write(A),C=:=26,
told(I),seen(O).
C:AZ-Prologin

C:AZ-Prologin>
I = fp_668ef70,
O = fp_668efd0,
PID = 172,
_3 = 9,
_4 = _4,
C = 26,
A =
yes"; hash["genre"]="25"; hash["used"]="true"; hash["incident"]="s_kill/2
s_wait/3"; azlist.push(hash); var hash={}; hash["id"]="233"; hash["name"]="s_wait/3"; hash["common"]=""; hash["format"]="s_wait(+I1,-I2,-I3)"; hash["argument"]="I1:終了したプロセスのプロセスID
I2:終了ステータスの上位8bit
I3:終了ステータスの下位8bit"; hash["text"]=""; hash["reference"]=""; hash["sample"]="●Linuxでの実行例

| ?-s_child(pwd,[],I,O,PID),repeat,get0(O,C),name(A,[C]),    
  write(A),C =:=4,told(I),seen(O),s_kill(PID,15),
s_wait(PID,X,Y).
/home/sofnec/prolog

I = fp_294ef10,
O = fp_294f1b0,
PID = 20322,
C = 4,
A = ,
X = 0,
Y = 15
yes


●Windowsでの実行例
 (s_childで実行するプログラムにより結果が異なります)


| ?-s_child(cmd,['/K','cd'],I,O,PID),s_sleep(1000),s_kill(PID,9),
s_wait(PID,_,_),repeat,get0(O,C),name(A,[C]),write(A),C=:=26,
told(I),seen(O).
C:AZ-Prologin

C:AZ-Prologin>
I = fp_668ef70,
O = fp_668efd0,
PID = 172,
_3 = 9,
_4 = _4,
C = 26,
A =
yes"; hash["genre"]="25"; hash["used"]="true"; hash["incident"]="s_child/5
s_kill/2"; azlist.push(hash); var hash={}; hash["id"]="234"; hash["name"]="s_sleep/1"; hash["common"]=""; hash["format"]="s_sleep(+I)"; hash["argument"]="I:sleepする時間の長さ(ミリ秒単位)"; hash["text"]="指定ミリ秒スリープする"; hash["reference"]=""; hash["sample"]=""; hash["genre"]="20"; hash["used"]="true"; hash["incident"]="s_usleep/1"; azlist.push(hash); var hash={}; hash["id"]="235"; hash["name"]="s_pid/1"; hash["common"]=""; hash["format"]="s_pid(-I)"; hash["argument"]="I:自プロセスのプロセスID"; hash["text"]=""; hash["reference"]=""; hash["sample"]=""; hash["genre"]="25"; hash["used"]="true"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="236"; hash["name"]="s_kill/2"; hash["common"]=""; hash["format"]="s_kill(+I1,+I2)"; hash["argument"]="I1:シグナルを送るプロセスのプロセスID
I2:送信するシグナル番号"; hash["text"]="子プロセスを削除する。"; hash["reference"]=""; hash["sample"]="●Linuxでの実行例

| ?-s_child(pwd,[],I,O,PID),repeat,get0(O,C),name(A,[C]),    
  write(A),C =:=4,told(I),seen(O),s_kill(PID,15),
s_wait(PID,X,Y).
/home/sofnec/prolog

I = fp_294ef10,
O = fp_294f1b0,
PID = 20322,
C = 4,
A = ,
X = 0,
Y = 15
yes


●Windowsでの実行例
 (s_childで実行するプログラムにより結果が異なります)


| ?-s_child(cmd,['/K','cd'],I,O,PID),s_sleep(1000),s_kill(PID,9),
s_wait(PID,_,_),repeat,get0(O,C),name(A,[C]),write(A),C=:=26,
told(I),seen(O).
C:AZ-Prologin

C:AZ-Prologin>
I = fp_668ef70,
O = fp_668efd0,
PID = 172,
_3 = 9,
_4 = _4,
C = 26,
A =
yes
"; hash["genre"]="25"; hash["used"]="true"; hash["incident"]="s_child/5
s_wait/3"; azlist.push(hash); var hash={}; hash["id"]="237"; hash["name"]="s_kill/1"; hash["common"]=""; hash["format"]="20140203削除"; hash["argument"]="I:シグナルを送るプロセスのプロセスID"; hash["text"]=""; hash["reference"]=""; hash["sample"]="●Linuxでの実行例

| ?-s_child(pwd,[],I,O,PID),repeat,get0(O,C),name(A,[C]),    
  write(A),C =:=4,told(I),seen(O),s_kill(PID,15),
s_wait(PID,X,Y).
/home/sofnec/prolog

I = fp_294ef10,
O = fp_294f1b0,
PID = 20322,
C = 4,
A = ,
X = 0,
Y = 15
yes


●Windowsでの実行例
 (s_childで実行するプログラムにより結果が異なります)

| ?-s_child(cmd,['/K','cd'],I,O,PID),s_sleep(1000),s_kill(PID,9),
s_wait(PID,_,_),repeat,get0(O,C),name(A,[C]),write(A),C=:=26,
told(I),seen(O).
C:\\AZ-Prolog\\bin

C:\\AZ-Prolog\\bin>
I = fp_668ef70,
O = fp_668efd0,
PID = 172,
_3 = 9,
_4 = _4,
C = 26,
A =
yes"; hash["genre"]="25"; hash["used"]="false"; hash["incident"]="s_child/5
s_kill/2
s_wait/3"; azlist.push(hash); var hash={}; hash["id"]="238"; hash["name"]="pm_session/4(OS/2)"; hash["common"]=""; hash["format"]="pm_session(+A1,+A2,-I1,-I2)"; hash["argument"]="A1:新セッションで実行させるプログラム名を指定する(絶対パス名)
A2:上のプログラムの起動時の引数
I1:新セッションのセッションID
I2:新セッションで起動したプロセスのプロセスID"; hash["text"]=""; hash["reference"]="削除20131203"; hash["sample"]=""; hash["genre"]=""; hash["used"]="false"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="239"; hash["name"]="pm_open/3"; hash["common"]=""; hash["format"]="pm_open(+A,+S1,+S2)"; hash["argument"]="A:オープンするもののパス名
S1:入力用ストリーム
S2:出力用ストリーム"; hash["text"]="DosOpen システムコールが ERROR_PIPE_BUSY を返したら DosWaitNmPipe システム
コールを実行する。従って名前つきパイプのオープンに適しているが、通常のファ
イルに対して実行しても特に問題はない。"; hash["reference"]="削除20131203"; hash["sample"]=""; hash["genre"]=""; hash["used"]="false"; hash["incident"]=""; azlist.push(hash); var hash={}; hash["id"]="240"; hash["name"]="create_neuron/4"; hash["common"]=""; hash["format"]="create_neuron(+I1,+I2,+I3,-AR)"; hash["argument"]="I1:入力層ニューロンの数
I2:中間層ニューロンの数
I3:出力層ニューロンの数
AR:ニューロンオブジェクト"; hash["text"]="引数で指定されたサイズのバックプロバケーション方式(逆伝播)のニューラルネットワークを構築し、ARにユニファイします。"; hash["reference"]=""; hash["sample"]="| ?-create_neuron(5,9,5,Neuron).
Neuron = array_5708/856
yes"; hash["genre"]="29"; hash["used"]="true"; hash["incident"]="learn_neuron/6
save_neuron/2
load_neuron/2
inference_neuron/3"; azlist.push(hash); var hash={}; hash["id"]="241"; hash["name"]="learn_neuron/6"; hash["common"]=""; hash["format"]="learn_neuron(+AR,+A,+I1,+I2,+I3,?I4)"; hash["argument"]="AR:ニューロンオブジェクト (create_neuron/4で第4引数に返された値)
A:学習する述語名
I1:学習する述語のアリティ
I2:学習する述語の入力信号の引数
I3:学習する述語の教師信号の引数
I4:学習した回数がユニファイされる。
又、数値指定の場合は学習回数の上限となる"; hash["text"]="「入力信号」、「教師信号」を含んだ述語からバックプロバケーション方式(逆伝播)の学習を行う。
「入力信号」は floot 型のリストで表され、要素の数が入力層の数と一致しなければならない。
「教師信号」は integer 型のリストで表され要素の数が出力層の数と一致しなければならない。

※教師信号のリストで指定できる数値は 0 か 1 であり、1 は 1 つしか指定できません。
収束条件は正解率が 95% を超えたときです。
尚、バックプロバケーション等の説明は他の参考書等を参照してください。"; hash["reference"]=""; hash["sample"]="| ?-listing.
kanpou([0.1,0.5,0.3,0.9],[0,0,0,1]).
kanpou([0.3,0.2,0.8,0.5],[0,0,1,0]).
kanpou([0.5,0.9,0.3,6.1],[0,1,0,0]).
kanpou([0.9,0.1,0.2,0.3],[1,0,0,0]).
yes
| ?-create_neuron(4,5,4,Neuron),learn_neuron(Neuron,kanpou,2,1,2,Loop).
Neuron = array_58624,
Loop = 384
yes"; hash["genre"]="29"; hash["used"]="true"; hash["incident"]="create_neuron/4
save_neuron/2
load_neuron/2
inference_neuron/3"; azlist.push(hash); var hash={}; hash["id"]="242"; hash["name"]="save_neuron/2"; hash["common"]=""; hash["format"]="save_neuron(+AR,+A)"; hash["argument"]="
AR: ニューロンオブジェクト(create_neuron/4 で第4引数に返された値)
A: ファイル名
"; hash["text"]="learn_neuron/6 で学習した知識をファイルにセーブする。"; hash["reference"]=""; hash["sample"]="| ?-listing.
kanpou([0.1,0.5,0.3,0.9],[0,0,0,1]).
kanpou([0.3,0.2,0.8,0.5],[0,0,1,0]).
kanpou([0.5,0.9,0.3,6.1],[0,1,0,0]).
kanpou([0.9,0.1,0.2,0.3],[1,0,0,0]).
yes
| ?-create_neuron(4,5,4,Neuron),learn_neuron(Neuron,kanpou,2,1,2,Loop),
save_neuron(Neuron,'kanpou.w').
Neuron = array_58624,
Loop = 384
yes"; hash["genre"]="29"; hash["used"]="true"; hash["incident"]="create_neuron/4
learn_neuron/6
load_neuron/2
inference_neuron/3"; azlist.push(hash); var hash={}; hash["id"]="243"; hash["name"]="load_neuron/2"; hash["common"]=""; hash["format"]="load_neuron(+AR,+A)"; hash["argument"]="AR:ニューロンオブジェクト(create_neuron/4 で第4引数に返された値)
A:ファイル名"; hash["text"]="save_neuron/2 でセーブした知識をロードする。
但し、セーブしたときのニューロンオブジェクトの入力層の数、中間層の数、出力層の数とロード時に指定するニューロンオブジェクトの入力層の数、中間層の数、出力層の数と一致しなければなりません。"; hash["reference"]=""; hash["sample"]="| ?-create_neuron(4,5,4,Neuron),load_neuron(Neuron,'kanpou.w').
Neuron = array_58624,
yes"; hash["genre"]="29"; hash["used"]="true"; hash["incident"]="create_neuron/4
learn_neuron/6
save_neuron/2
inference_neuron/3"; azlist.push(hash); var hash={}; hash["id"]="244"; hash["name"]="inference_neuron/3"; hash["common"]=""; hash["format"]="inference_neuron(+AR,+L1,+L2)"; hash["argument"]="AR:ニューロンオブジェクト(create_neuron/4 で第4引数に返された値)
L1:推論させる入力リスト
L2:推論後の出力リスト"; hash["text"]="learn_neuron/6 で学習した知識をもとに推論を行う。
L1,L2 ともに floot 型のリストであり L2 の要素が 0.9 以上であれば 1 それ未満のものが 0 と見なされる。"; hash["reference"]=""; hash["sample"]="| ?-create_neuron(4,5,4,Neuron),load_neuron(Neuron,'kanpou.w'),
inference_neuron(Neuron,[0.1,0.5,0.3,0.9],L).
Neuron = array_57081856,
L = [0.00342921267458552,0.0681535219617237,
0.0914518719506123,0.91807457307280]
yes"; hash["genre"]="29"; hash["used"]="true"; hash["incident"]="create_neuron/4
save_neuron/2
load_neuron/2
learn_neuron/6"; azlist.push(hash); var hash={}; hash["id"]="245"; hash["name"]="create_array/2"; hash["common"]=""; hash["format"]="create_array(+I,-AR)"; hash["argument"]="
I :array
AR :array オブジェクト
"; hash["text"]="I で指定されたサイズ分の arrayエリアを確保し ARにユニファイします。
確保したエリアの初期値は全て 0となる。"; hash["reference"]=""; hash["sample"]="| ?- create_array(100,Array).
Array = array_57081856
yes"; hash["genre"]="28"; hash["used"]="true"; hash["incident"]="set_array/3
get_array/3"; azlist.push(hash); var hash={}; hash["id"]="246"; hash["name"]="set_array/3"; hash["common"]=""; hash["format"]="set_array(+AR,+I,+T)"; hash["argument"]="
AR :array オブジェクト(create_array/2 で第2引数に返された値)
I :位置を指定 (0≦I< array サイズ)
T :任意の term
"; hash["text"]="create_array/2 で作成した array に項を入れます。

※arrayオブジェクト自身も set_array する事は可能だが再帰するような代入はしてはいけません。"; hash["reference"]=""; hash["sample"]="| ?- create_array(100,Array),set_array(Array,0,a(1)).
Array = array_57081856
yes"; hash["genre"]="28"; hash["used"]="true"; hash["incident"]="create_array/2
get_array/3"; azlist.push(hash); var hash={}; hash["id"]="247"; hash["name"]="get_array/3"; hash["common"]=""; hash["format"]="get_array(+AR,+I,-T)"; hash["argument"]="
AR :array オブジェクト(create_array/2 で第2引数に返された値)
I :位置を指定 (0≦I< array サイズ)
T :取り込まれた項がユニファイする
"; hash["text"]="set_array/3 により代入された項を取り出す。"; hash["reference"]=""; hash["sample"]="| ?- create_array(100,Array),set_array(Array,0,a(1)),
get_array(Array,0,V).
Array = array_57081856
V = a(1)
yes"; hash["genre"]="28"; hash["used"]="true"; hash["incident"]="create_array/2
set_array/3"; azlist.push(hash); var hash={}; hash["id"]="248"; hash["name"]="- /fy"; hash["common"]="ISO"; hash["format"]="-N"; hash["argument"]="N:数値か数式。"; hash["text"]="Nの値の符号を反転する(2の補数をつくる)単項演算子です。
もし、「- -1」というように2つ以上書く場合は、「-」と「-」の間には必ず「空白」を入れる必要があります。
もし「-」と「-」を続けて書くと、エラー(syntax error)となります。"; hash["reference"]=""; hash["sample"]="| ?-X is -1.
X = -1
yes
| ?-X is - -1.
X = 1
yes
| ?-X is --1.
Syntax error"; hash["genre"]="11"; hash["used"]="true"; hash["incident"]="is /xfx
- /yfx"; azlist.push(hash); var hash={}; hash["id"]="249"; hash["name"]="+ /yfx"; hash["common"]="ISO"; hash["format"]="N1 + N2"; hash["argument"]="N1・N2:数値か数式。"; hash["text"]="is /xfxなどの数式を評価する述語の引数の中で加算演算を行います。
N1からN2を足した値を求めます。"; hash["reference"]=""; hash["sample"]="| ?-X is 1 + 2.
X = 3
yes
| ?-X is 1 + (-1).
X = 0
yes
| ?- X is 1.0 + (-1).
X = 0.000000000000000
yes"; hash["genre"]="11"; hash["used"]="true"; hash["incident"]="is /xfx"; azlist.push(hash); var hash={}; hash["id"]="250"; hash["name"]="- /yfx"; hash["common"]="ISO"; hash["format"]="N1 - N2"; hash["argument"]="N1・N2:数値か数式。"; hash["text"]="is /xfxなどの数式を評価する述語の引数の中で減算演算を行います。
N1からN2を引いた値を求めます。"; hash["reference"]=""; hash["sample"]="| ?-X is 1 - 2.
X = -1
yes
| ?-X is 1 - 1.
X = 0
yes
| ?- X is 1.0 - 1.
X = 0.000000000000000
yes"; hash["genre"]="11"; hash["used"]="true"; hash["incident"]="is /xfx
- /fy"; azlist.push(hash); var hash={}; hash["id"]="251"; hash["name"]="* /yfx"; hash["common"]="ISO"; hash["format"]="N1 * N2"; hash["argument"]="N1・N2:共に数式。"; hash["text"]="is /xfyなどの数式を評価する述語の引数の中で乗算演算を行います。
N1とN2を掛けた値を求めます。"; hash["reference"]=""; hash["sample"]="| ?-X is 3 * 2.
X = 6
yes
| ?-X is 1 * (-1).
X = -1
yes
| ?-X is 1 * 0.0.
X = 0.000000000000000
yes"; hash["genre"]="11"; hash["used"]="true"; hash["incident"]="is /xfx"; azlist.push(hash); var hash={}; hash["id"]="252"; hash["name"]="¥/ /yfx"; hash["common"]="ISO"; hash["format"]="N1 / N2"; hash["argument"]="I1 ¥/ I2、I1 or I2、どちらでも同じ"; hash["text"]="is /xfxなどの数式を評価する述語の引数の中で整数値のビット毎(2進数表現したときの各桁毎)に論理和演算を行います。
なお、AZ-Prologの整数は補数表現の符号付きですから、最上位の桁が0になるか1になるかで符号が変わりますので、注意が必要です。
演算子の表現は ¥/ でも or でも全く同じ意味を持ちます。ISOの¥/ /yfxと同じです。 "; hash["reference"]=""; hash["sample"]="| ?-X is 5 ¥/ 3.
X = 7
yes
| ?-X is 5 or 3.
X = 7
yes"; hash["genre"]="11"; hash["used"]="true"; hash["incident"]="is /xfx
/¥ /yfx
and /yfx
"; azlist.push(hash); var hash={}; hash["id"]="253"; hash["name"]="mod/2"; hash["common"]="ISO"; hash["format"]="I1 mod I2"; hash["argument"]="整数値か整数値を持つ数式"; hash["text"]="I1をI2で割った余りを求めます。
定義式は、I1 - I2*floor(I1/I2)。
I1, I2が共に正の整数値の場合、rem/2と同じ値となりますが、それ以外の場合には異なる値となることがあります。
なお、ver.7.xx以前のAZ-Prologではmodの計算はver. 7.xxのremの計算値に一致します。
0で割るとEvaluation error: zero_divisor
整数以外の値のとき、Type error: integer expected"; hash["reference"]=""; hash["sample"]="| ?-X is 13 mod 11.
X = 2
yes
| ?-X is -13 mod 11.
X = -2
yes
| ?-"; hash["genre"]="11"; hash["used"]="true"; hash["incident"]="is /xfx
rem/2"; azlist.push(hash); var hash={}; hash["id"]="254"; hash["name"]="^ /xfy"; hash["common"]=""; hash["format"]="N1 ^ N2"; hash["argument"]="N1:基数。数値か数式。
N2:指数。数値か数式。"; hash["text"]="is /xfxなどの数式を評価する述語の引数の中で指数演算を行います。
N1のN2 乗を計算します。
AZ-Prolog ver.7.xx以前のversionでは、指数として整数のみに対応していたので注意が必要です。"; hash["reference"]=""; hash["sample"]="| ?-X is 2.0 ^ 3.0.
X = 8.00000000000000
yes
| ?-X is 2.0 ^ 2.0 ^ 2.0.
X = 16.0000000000000"; hash["genre"]="11"; hash["used"]="true"; hash["incident"]="is /xfx
** /xfx"; azlist.push(hash); var hash={}; hash["id"]="255"; hash["name"]="/ /yfx"; hash["common"]="ISO"; hash["format"]="I1 / I2、I1 and I2"; hash["argument"]="I1・I2:共に整数値、または整数値の数式に限る。"; hash["text"]="is /xfxなどの数式を評価する述語の引数の中で整数値のビット毎(2進数表現したときの各桁毎)に論理積演算を行います。
なを、AZ-Prologの整数は補数表現の符号付きですから、最上位の桁が0になるか1になるかで符号が変わりますので、注意が必要です。
演算子の表現は / でも and でも全く同じ意味を持ちます。"; hash["reference"]=""; hash["sample"]="| ?-X is 5 / 3.
X = 1
yes
| ?-X is 5 and 3.
X = 1
yes"; hash["genre"]="11"; hash["used"]="false"; hash["incident"]="is /xfx
/ /yfx
or /yfx"; azlist.push(hash); var hash={}; hash["id"]="256"; hash["name"]="/¥ /yfx"; hash["common"]="ISO"; hash["format"]="I1 /¥ I2、I1 and I2、どちらでも同じ"; hash["argument"]="I1・I2:共に整数値、または整数値の数式に限る。"; hash["text"]="is /xfxなどの数式を評価する述語の引数の中で整数値のビット毎(2進数表現したときの各桁毎)に論理積演算を行います。なお、AZ-Prologの整数は補数表現の符号付きですから、最上位の桁が0になるか1になるかで符号が変わりますので、注意が必要です。
演算子の表現は /¥ でも and でも全く同じ意味を持ちます。"; hash["reference"]=""; hash["sample"]="| ?-X is 5 /¥ 3.
X = 1
yes
| ?- X is 5 and 3.
X = 1
yes
"; hash["genre"]="11"; hash["used"]="true"; hash["incident"]="is /xfx
¥/ /yfx
or /yfx
"; azlist.push(hash); var hash={}; hash["id"]="257"; hash["name"]="<< /yfx"; hash["common"]="ISO"; hash["format"]="I1 <