素性構造型対応AZ-Prolog Ver.9をリリース致しました。ぜひ一度おためしください。 x

AZ-Prolog Version 9.24(2016/02/09)

[新規機能]

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