考虑一下:
list_length([], 0).
list_length([H|T], N) :- list_length(T, N - 1).
它不会给出编译错误,但不起作用。
我的想法是:
假设我打电话给
list_length([1], N)
我们查询
list_length([], N - 1)
它告诉你
N - 1 = 0
它发现 N 是 1 并返回 N 的值。
相反,通过
gprolog
,它告诉我 no
。
特别是,它的编译也令人惊讶,因为:
?- 1 - 1.
uncaught exception: error(existence_error(procedure,(-)/2),top_level/0)
-
并不总是算术运算符。 N - 1 = 0
不会成功使用 N = 1
,因为 =
不是算术约束求解器。
如果您使用 gprolog,
N - 1 #= 0
会给您 N = 1
。您的代码将适用于此:
list_length([], N) :- N #= 0.
list_length([H|T], N) :- list_length(T, N - 1).
您可以在已经链接的问题中看到,有多种更好的方法可以做到这一点。