2

我正在学习 Prolog。我正在试验一个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这样我可以查询元素索引?
4

1 回答 1

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
| ?-
于 2017-03-07T19:23:57.217 回答