Prolog 未知变量评估

问题描述 投票:0回答:1

考虑一下:

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)
prolog programming-languages
1个回答
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).

您可以在已经链接的问题中看到,有多种更好的方法可以做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.