在谓词的响应中评估 s(N),而不会丢失功能

Evaluating s(N) within a predicate's response, without losing functionality

我正在学习序言。我正在试验 elemindex 谓词,其形式为 elemindex(element, index, list),例如 elemindex(1,0,[1,2,3,1]).elemindex(3,0,[1,2,3,1])..

由于实例化限制,我最终得到了这个:

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. 如何让 s(s(s(0))) 在我的结果中显示为 3
  2. 如何实现 elemindex 以便我可以查询元素 索引?

#=/2 是 CLPFD 库的一部分,您可以使用它对整数进行 "reason"。 is/2 运算符旨在评估一个完全已知的表达式,因此要求第二个参数被完全绑定,以便立即评估。 #=/2 没有那个限制。您不会得到实例化错误,Prolog 将尝试求解变量。在 "Prolog clpfd" 上进行 google 搜索。

以下是它如何与您的代码一起工作:

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
| ?-