GNU Prolog 的数组

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 = 3
X = 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 = 2
Y = b
Z = 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 = null
X = g_array([g_array([null,null]),g_array([null,null]),
             g_array([null,null,null,null]),g_array([null,null])])

    


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值