2015-10-28 59 views
0

我最近想要用Prolog来试验一下统一过程是如何工作的,所以我编写了下面的代码来返回列表中的第n个元素。在Prolog中输出问题

getfromarray([X|_],1,X). 
getfromarray(A,N,E):- 
    N > 1, 
    A = [_|Y], 
    N1 is N-1, 
    getfromarray(Y,N1,E). 

然而,在进入输入程序作为
getfromarray(A,3,E),它返回: -

A = [_G5129, _G5132, E|_G5136] 

我明白,因为我写的规则A = [_|Y],A被统一地满足上述条件的程序中的规则,因此A以这种格式显示。但是,我不明白为什么E不与数组中的值统一。我确实阅读了Prolog中的统一基础知识,并且我明白,虽然答案没有错,但它并没有按照它的意图去做。有人可以提出一个统一的话题,我可能错过了哪些可以帮助我解决这个小问题?

编辑: 当我通过列表作为参数传递给程序,它给了电子商务在list.However,相关的价值时,我一个统一的变量A与列表并通过了作为一个参数该程序,它显示了与我上面提到的相同的输出。

5? - getfromarray([1,2,5,4,5],3,E)。

E = 5。

6? - A = [1,2,3,4,5]。

A = [1,2,3,4,5]。

7? - getfromarray(A,3,E)。

A = [_G576,_G579,E | _G583]。

8 -

+0

Ë** **被统一为所述阵列中的 '值':共享,无关的变量,创建递归到1 ... – CapelliC

+0

你好,感谢您的反馈!我尝试将一个列表作为参数传递给程序,并将E的相关值赋予列表中的元素。但是,当我将变量A统一到列表中,然后将A作为参数传递给程序时,它给出了与上面相同的输出。 –

回答

0

序言不存储您的清单,因此A是uninstantiate。

A = [1, 2, 3, 4, 5]. 
getfromarray(A,3,E). 

这就像只调用:

getfromarray(A,3,E). 

尝试在此代替:

A = [1, 2, 3, 4, 5], getfromarray(A,3,E). 
+0

你好,感谢您的反馈!当我按照你所建议的方式传递参数时,程序工作正常。我不知道prolog在统一时不存储变量的列表。 –

+0

不客气:) – Nickelium