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)
    不会终止,但它可能会终止