计算列表中元素的数量:影响的工作原理

aze*_*555 6 prolog clpfd

我正在研究Prolog问题,包括计算列表元素的数量:

count([], 0).
count([H|T], N) :-
    count(T, X),
    N is X+1,
    N > 0.
Run Code Online (Sandbox Code Playgroud)

我能理解为什么它是这样写的但是我不明白为什么我们不能用X代替N是X + 1 是N-1

非常感谢!

mat*_*mat 5

你的问题非常合理,+ 1.

这种看似随意的选择的原因在于它(is)/2是一个相对较低级别的谓词,只适用于只能在程序上而不是以声明方式理解的非常具体的情况.因此,(is)/2初学者非常难以理解,应该更好地避免,因为它会破坏我们在使用Prolog时想要享受的许多关系属性.

声明性解决方案是使用约束,您可以完全按照您的说法执行操作.在过去的整数关系,只需更换(is)/2(#=)/2享受关系性质可以直观地期待.

例如,使用GNU Prolog:

count([], 0).
count([_|Ls], N) :-
        count(Ls, X),
        X #= N - 1,
        N #> 0.

在SICStus Prolog和SWI等其他系统中,您目前仍需要使用library(clpfd)此功能.另外,我强烈建议为这种关系建立一个更具说明性的名称,明确哪个参数表示:

:- use_module(library(clpfd)).

list_length([], 0).
list_length([_|Ls], N) :-
        list_length(Ls, X),
        X #= N - 1,
        N #> 0.

示例查询:

?- list_length([_,_,_], N).
N = 3.

?- list_length(Ls, 2).
Ls = [_G602, _G605] .

我将改进这个谓词的终止属性作为一个简单的练习.