我正在研究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?
非常感谢!
你的问题非常合理,+ 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] .
我将改进这个谓词的终止属性作为一个简单的练习.