我通过在Swipl、gprolog和yap中将其添加到用户文件中测试了以下代码:
isqrt(N, _) :-
N < 0, !, fail.
isqrt(N, N) :-
N < 2.
isqrt(N, R) :-
X is N,
Y is (N // 2),
isqrt(N, X, Y, R).
isqrt(_, X, Y, X) :-
Y >= X.
isqrt(N, _, Y, R) :-
Z is ((Y + N // Y) // 2),
isqrt(N, Y, Z, R).
这在Swipl和Yap中可以正常工作,但在gprolog中,N>1会收到以下错误消息:
uncaught exception: error(existence_error(procedure,isqrt/0),isqrt/0)
这对我来说很奇怪,因为我的代码中没有一个谓词依赖于
isqrt/0
. 这可能是GNU Prolog中的错误吗?作为一个解决方法,我能做些什么?
编辑:下面是我在Ubuntu上的gprolog中生成此错误的具体操作:
$ gprolog
GNU Prolog 1.4.5 (64 bits)
Compiled Feb 5 2017, 10:30:08 with gcc
By Daniel Diaz
Copyright (C) 1999-2016 Daniel Diaz
| ?- [user].
compiling user for byte code...
isqrt(N, _) :-
N < 0, !, fail.
isqrt(N, N) :-
N < 2.
isqrt(N, R) :-
X is N,
Y is (N // 2),
isqrt(N, X, Y, R).
isqrt(_, X, Y, X) :-
Y >= X.
isqrt(N, _, Y, R) :-
Z is ((Y + N // Y) // 2),
isqrt(N, Y, Z, R).
user compiled, 17 lines read - 1656 bytes written, 10751 ms
yes
| ?- isqrt(100, X).
uncaught exception: error(existence_error(procedure,isqrt/0),isqrt/0)