GNU Prolog 的數組
來源:互聯網
上載者:User
GNU Prolog 的數組Prolog 的設計發明人是法國馬賽大學的學者。為了維護其語言純粹和學術特點,原始的 Prolog 沒有數組,沒有顯式的資料類型。對於使用 prolog 的實際需要來說,這未必件好事情,因為,在不少情況下,程式跑得太慢了。比如,在 C 語言中的數組,可以方便地用下標定位檢索資料,如 array1[3],array2[5][7] 之類。做同樣的事情,在 Prolog 裡很麻煩,運行效率低下。如,檢索一維list第N個成員的值,必須從第一個成員挨個掃描到N:array1(N,N,A,[A|_]):- !.array1(N,M,B,[_|T]):- array1(N,M+1,B,T).若是檢索多維大數組,會慢得難以忍受。GNU Prolog 設計了一套處理數組的辦法,增強了Prolog的實用性。下面用例句看看如何處理數組。1、數組的建立、初始化、使用下標第一個例子:| ?- g_assign(w, g_array(3)), g_read(w, X).X = g_array([0,0,0])符號(| ?-)是解譯器控制台提示符;g_assign, g_array, g_read 是三個內部謂詞;(1). g_array(3) 建立有3個成員的數組;(2). g_assign(w,g_array(3)) 這個數組的名字叫 w;(3). g_read(w,X) 把數組 w 讀給變數 X;X = g_array([0,0,0]) 是謂詞匹配的顯示結果,數組初始化的預設值是0。第二個例子:| ?- g_assign(w(0), 16), g_assign(w(1), 32), g_assign(w(2), 64), g_read(w, X).X = g_array([16,32,64])分別給下標為0、1、2的數組w的成員賦值,然後把數組 w 讀給變數 X。這相當於:| ?- g_assign(k, g_array([16,32,64])), g_read(k, X).X = g_array([16,32,64])2、測定數組的長度| ?- g_assign(k, g_array(3,null)), g_read(k, X), g_array_size(k, S).S = 3X = g_array([null,null,null])3、二維數組例一:| ?- g_assign(w, g_array(2, g_array(3))), g_read(w, X).X = g_array([g_array([0,0,0]),g_array([0,0,0])])例二:| ?- ( for(I,0,1), for(J,0,2), K is I*3+J, g_assign(w(I,J), K), fail ; g_read(w, X) ).X = g_array([g_array([0,1,2]),g_array([3,4,5])])例三:| ?- g_read(w(1),X).X = g_array([3,4,5])4、混合成員數組: 例一:| ?- g_assign(w,g_array([1,2,g_array([a,b,c]), g_array(2,z),5])), g_read(w, X).X = g_array([1,2,g_array([a,b,c]), g_array([z,z]),5])例二:| ?- g_read(w(1), X), g_read(w(2,1), Y), g_read(w(3,1), Z).X = 2Y = bZ = z例三:| ?- g_read(w(1,2),X).uncaught exception: error(domain_error(g_array_index,w(1,2)),g_read/2)5、數組的擴容加長例一:| ?- g_assign(a, g_array([10,20,30])), g_read(a, X).X = g_array([10,20,30])例二:| ?- g_assign(a, g_array_extend(5,null)), g_read(a, X).X = g_array([10,20,30,null,null])例三:| ?- g_assign(a, g_array([10,20,30])), g_read(a, X).X = g_array([10,20,30])例四:| ?- g_assign(a, g_array_extend([1,2,3,4,5,6])), g_read(a, X).X = g_array([10,20,30,4,5,6])6、數組的自動化例一:| ?- g_assign(t, g_array_auto(3)), g_assign(t(1), foo), g_read(t,X).X = g_array([0,foo,0])例二:| ?- g_assign(t(5), bar), g_read(t,X). X = g_array([0,foo,0,0,0,bar,0,0])例三:| ?- g_assign(t, g_array_auto(2, g_array(2))), g_assign(t(1,1), foo), g_read(t,X).X = g_array([g_array([0,0]),g_array([0,foo])])例四:| ?- g_assign(t(3,0), bar), g_read(t,X).X = g_array([g_array([0,0]),g_array([0,foo]),g_array([0,0]),g_array([bar,0])])例五:| ?- g_assign(t(3,4), bar), g_read(t,X).uncaught exception: error(domain_error(g_array_index,t(3,4)),g_assign/2)例六:| ?- g_assign(t, g_array_auto(2, g_array_auto(2))), g_assign(t(1,1), foo), g_read(t,X).X = g_array([g_array([0,0]),g_array([0,foo])])例七:| ?- g_assign(t(3,3), bar), g_read(t,X).X = g_array([g_array([0,0]),g_array([0,foo]),g_array([0,0]), g_array([0,0,0,bar])])例八:| ?- g_assign(t, g_array_auto(2, g_array_auto(2, null))), g_read(t(2,3), U), g_read(t, X).U = nullX = g_array([g_array([null,null]),g_array([null,null]), g_array([null,null,null,null]),g_array([null,null])])