在谓词的响应中评估 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
会使我失去评估第一种查询的能力。
所以,我的问题有两个:
- 如何让
s(s(s(0)))
在我的结果中显示为 3
?
- 如何实现
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
| ?-
我正在学习序言。我正在试验 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
会使我失去评估第一种查询的能力。
所以,我的问题有两个:
- 如何让
s(s(s(0)))
在我的结果中显示为3
? - 如何实现
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
| ?-