整数平方根适用于SWI-Prolog和YAP,但不适用于GNU-Prolog

时间:2018-12-09 02:25:05

标签: prolog gnu-prolog

我通过将以下代码添加到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)

1 个答案:

答案 0 :(得分:1)

已经有一些报告,包括GNU Prolog邮件列表中的Linux下的类似错误,尤其是Ubuntu / kubuntu:

http://lists.gnu.org/archive/html/bug-prolog/2018-09/msg00002.html

在报告案例中,从源代码编译GNU Prolog解决了该问题。