Целочисленный квадратный корень работает в SWI-Prolog и YAP, но не в GNU-Prolog - PullRequest
0 голосов
/ 09 декабря 2018

Я протестировал следующий код, добавив его в файл пользователя в 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?Что я могу сделать в качестве обходного пути?

Редактировать: Вот именно то, что я делаю, чтобы создать эту ошибку в gprolog на Ubuntu:

$ 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 голосов
/ 09 декабря 2018

Были некоторые сообщения, в том числе в списке рассылки GNU Prolog, о похожих ошибках в Linux, в частности, Ubuntu / kubuntu:

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

В случаях отчетов компиляция GNUПролог из источников решил проблему.

...