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])])
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])])
相关文章推荐
- 创建一个字符串数组,总共5个元素,每个元素最多保存30个字符,写一个函数排序整个数组。
- Swift 数组详细用法
- JSON对象中的JSONObject和JSONArray以及与Map、String、数组的转化
- 数据结构 -- 队列 & 循环队列 -- 数组实现
- 找出数组中两个只出现一次的数字
- 前、后自增,前、后自减,复杂赋值运算符,java数据类型,数组定义方法
- 列出数组中取出的数的全部组合(用递归实现)
- 实现动态分配一维,二维,三维数组
- java中数组与List相互转换的方法
- 经典数据结构--数组实现的栈
- 将两个有序数组归并为一个升序数组-Java实现
- c# break与continue运用,数组
- 字符串指针与字符数组的区别
- 程序员面试问题1:数组问题 Programming Interview Questions 1: Array Pair Sum
- 柔性数组的使用
- KMP算法中next数组的求取
- JavaScript之数组方法(Array对象属性)
- 数组(2)
- 数组的运算
- 去除数组重复元素