List 在谓词中计算s(N)';s响应,而不丢失功能
我在学序言。我在试验一个List 在谓词中计算s(N)';s响应,而不丢失功能,list,prolog,clpfd,successor-arithmetics,List,Prolog,Clpfd,Successor Arithmetics,我在学序言。我在试验一个elemindex谓词,其形式为elemindex(元素、索引、列表),例如,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 =
elemindex
谓词,其形式为elemindex(元素、索引、列表)
,例如,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库的一部分,用于对整数进行“推理”。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
| ?-
在这种情况下,为什么要使用
s/1
?您是否尝试过N#=M+1
?(使用库clpfd
)@潜伏者你能解释一下使用#=
会做什么吗?我对prolog很陌生。elemindex(1,1,L)
不会终止,但它可能会终止