您的位置:首页 > 其它

GNU Prolog 的数组

2008-10-20 07:30 197 查看
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])])
    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: