[新規機能]
1) 文字キャラクタコードと制御コードの表現
・ c’に続く’¥’を除く1文字はその文字コードを表します。
| ?- A = [ c'a, c'A, c'%, c' , c',,c'あ ]. A = [97,65,37,32,44,33440] yes<例>
・ c’\\ は \の文字コードを表します。
| ?- A is c'¥¥ . A = 92 yes
・ c’¥ に続く次の1文字は制御コードを表します。これ以外はエラーとなります。
b | backspace | (character code 8) |
t | horizontal tab | (character code 9) |
n | newline | (character code 10) |
v | vertical tab | (character code 11) |
f | form feed | (character code 12) |
r | carriage | (character code 13) |
e | escape | (character code 27) |
d | delete | (character code 127) |
a | alarm | (character code 7) |
| ?- X = [ c'¥b ,c'¥t ,c'¥n ,c'¥v ,c'¥f ,c'¥r ,c'¥e ,c'¥d ,c'¥a ]. X = [8,9,10,11,12,14,27,127,7] yes | ?-X is c'¥A. Syntax error
2)アトム中に制御コードが現れた場合、デバッグモード leash3(2) で現在は、
“改行 -> ‘(¥n)’表記とする”としていますが、これを制御コードにも拡張する。
¥n <=== carriage return,newline (character code 13,10) 現在仕様
¥n <=== carriage return,newline (character code 31) 現在仕様
¥n <=== newline (character code 10) 現在仕様
追加表示変換
¥¥ <=== character code 92
¥b <=== backspace (character code 8)
¥t <=== horizontal tab (character code 9)
¥v <=== vertical tab (character code 11)
¥f <=== form feed (character code 12)
¥r <=== carriage return (character code 13)
¥e <=== escape (character code 27)
¥d <=== delete (character code 127)
¥a <=== alarm (character code 7)
|| ?- name(A,[8,9,10,92]).
Succ : name(‘(¥b)(¥t)(¥n)(¥¥)’,[8,9,10,92])
3) TopLevelの変数内容Writeでは、デバッグモード、leash3如何に関わらず上記を適用する。
a('a b'). | ?- a(X). X = 'a(¥n)b' yes
4)ストリングの重リスト化シンタックスの新設
“で始まり”で終わる文字列に続けて変数を記述した場合、その変数を最終CDR、つまり差分リストとする
| ?- X="aho"L. X = [97,104,111|L_1] | ?- X="aho"L,L=[c't|M],M="baka"S. X =[97,104,111,9,98,97,107,97|S_39],
DCGの終端節は直接書ける
| noun("dog"L,L).
5) float のwrite
| ?- write(12.34). 12.34
従来: 12.3400000000000
display,writeqも同じ。
2016/01/08 Update
※Linux版prolog_c 漢字交じりコンソール入力のバックスペースを改良
2015/12/14 Update
AZ-Prolog V9(2015/12/14 ) 新機能,追加述語
[制約変数マクロ機能] ※詳細はマニュアル 9-3
s_constraints_mode/2
is_clp_macro_exist/2
macro_consult/1
[素性構造型(Feature Structure型)導入 ] ※詳細はマニュアル 9-2
fs_mode/2
fs_delimiter/2
fstructure/1
[Atom文字列領域の一括確保]
メモリのフラグメンテーション化を考慮し、アトムの文字列領域を起動時に一括確保して使い回す方式に変更。
| ?-statistics. ATOM (cell) 2048000 USED: 1252 ARITY (cell) 2048000 USED: 704 CHAR AREA 160000K USED: 204K ([0.1%]) HEAP (cell) 2097152 USED: 0 HASH AREA 65536K USED: 0K ([0.0%]) LSTACK (cell) 1048576 MAX: 23 GSTACK (cell) 2097152 MAX: 41 yes
[その他追加組込述語など]
1)制約マクロの記述のために、op(540,xfy,#) を追加。
【書式】変数#制約記述
制約記述:変数が値をもったときに遅延実行されるゴール(列)、領域制約リスト。 制約記述にオペレータが含まれる場合はその強度を考慮し、適切な括弧を付与する。
a(X#(Y is X+1),Y).
b(X#[1..100],Y#[male,female]).
2)出現チェック付きユニファイヤ
unify_with_occurs_check/2 [ISO]
ユニファイする項にサイクリックな変数が含まれていればFailします。
?- unify_with_occurs_check(X,[X]). no ?- X=[X]. X = [] yes
3)16進数値の表現の追加。 従来は 0’ffff 表現のみ。
これに gnuprolog,swi-prologで使われている、0xffffの表現を追加
?- X is 0x0f*0'10. X = 240 yes
4)term_string(?Term,?String) Term と文字列ストリングの相互変換
?- term_string(a([1,b]),L). L = [97,40,91,49,44,98,93,41] yes ?- term_string(T,"a(X,Y)"). T = a(X_30,Y_32) yes
5)clpvar(+Term) Termが制約変数のときに成功する
?- freeze(X,write(X)),clpvar(X). yes ?- clpvar(X). no
6)s_int_ovf_mode(?OnOff,+OnOff)
on のとき、コンサルト、Readにおいて、integerのオーバーフローをエラーにする。
計算結果のオーバーフローはどちらのモードでもチェックしない。defaultはon。
| ?-s_int_ovf_mode(_,off). _.2 = on yes | ?- X is 0'ffffffffffffffff. X = -1 yes | ?-s_int_ovf_mode(_,on). _.2 = off yes | ?- X is 0'ffffffffffffffff. Illegal argument supplied
[拡張機能組込述語]
redis_command_to_term/4
redis_command_to_term(+CONTEXT, +COMMAND, -RETURN_TYPE, -RETURN_VALUE) redis_command/4同様、指定したコマンドを実行しますが、getでのRETURN_VALUEを項として読み込みます。 s_constraints_modeがonの場合で読み込み項の変数に制約マクロ記述がある場合、読み込み時、該当変数に制約を付与します。 読み込み時、正しい項でない場合、アトムで返します。
:- dlib_require(redis). test(X,V2):- redis_connect('127.0.0.1',6379,3000,C), s_constraints_mode(Def,off), redis_command(C,[set,mykey,X],A,B), writeq(A=B),nl, redis_command(C,[get,mykey],T0,V0), writeq(T0=V0),nl, redis_command_to_term(C,[get,mykey],T1,V1), writeq(T1=V1),nl, s_constraints_mode(_,on), redis_command_to_term(C,[get,mykey],T2,V2), writeq(T2=V2),nl, s_constraints_mode(_,Def), redis_free_context(C). % 制約マクロ付き項をSetし、Getする | ?-test(a(X#(Y is X+3),Y),L),L=a(10,P). redis_REPLY_STATUS=[79,75] redis_REPLY_STRING=[97,40,88,95,50,54,35,89,95,50,56,32,105,115,32,88,95,50,54,43,51,44,89,95,50,56,41] redis_REPLY_STRING=a(X_26_187#(Y_28_189 is X_26_187+3),Y_28_189) redis_REPLY_STRING=a(_210,Y_28_208) X = X_26, Y = Y_28, L = a(10,13), P = 13 yes % 項に変換できないデータはアトムでGetする | ?-test('a(X',S). redis_REPLY_STATUS=[79,75] redis_REPLY_STRING=[97,40,88] redis_REPLY_STRING='a(X' redis_REPLY_STRING='a(X' S = 'a(X' yes