2017-03-07 32 views
2

我正在学习Prolog。我正在试验elemindex谓词,形式为elemindex(element, index, list),例如,elemindex(1,0,[1,2,3,1]).elemindex(3,0,[1,2,3,1]).在谓词的响应中评估s(N),而不会丢失功能

由于实例的限制,我结束了这一点:

elemindex(E, 0, [E|_]). 
elemindex(E, s(M), [_|L]) :- elemindex(E,M,L). 

不过,如果我查询?- elemindex(1,N,[1,2,3,1]).,因为在我的例子,Prolog的回应:

N = 0 
N = s(s(s(0))) 
yes 

这肯定是工作,但我想s(s(s(0)))至少显示为3。此外,我无法执行像?- elemindex(E, 3, [1,2,3,4]).这样的查询,但将代码更改为使用N is M+1使我无法评估第1种查询。

所以,我的问题是2倍:

  1. 我怎样才能得到s(s(s(0)))显示在我的结果3
  2. 我该如何实现elemindex这样我可以查询元素的索引?
+2

为什么你使用'S/1'在这种情况下?你尝试过'N#= M + 1'吗? (使用库'clpfd') – lurker

+0

@lurker能解释一下'#='会做什么吗?我对prolog很陌生。 – AJFarmar

回答

2

#=/2是CLPFD库的一部分,这是你用来对整数进行“推理”的部分。 is/2运算符旨在评估一个完全已知的表达式,因此要求第二个参数完全绑定以便立即可评估。 #=/2没有这个限制。你不会得到实例化错误,Prolog会尝试解决这些变量。在“Prolog clpfd”上进行谷歌搜索。

下面是它的工作原理与您的代码:

elemindex(E, 0, [E|_]). 
elemindex(E, Index, [_|L]) :- 
    Index #= N + 1, 
    N #>= 0, 
    elemindex(E, N, L). 

然后查询:

| ?- elemindex(1,N,[1,2,3,1]). 

N = 0 ? a 

N = 3 

no 
| ?- elemindex(E, 3, [1,2,3,4]). 

E = 4 ? a 

no 
| ?- 
+1

这是行不通的,谢谢你的解释。 – AJFarmar

+1

'elemindex(1,1,L)'不会终止 - 但它可能 – false

+1

@错误很好,赶上,谢谢! – lurker