代码之家  ›  专栏  ›  技术社区  ›  castle-bravo

整数平方根在swi prolog和yap中有效,但在gnu prolog中无效。

  •  0
  • castle-bravo  · 技术社区  · 6 年前

    我通过在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 回复  |  直到 6 年前
        1
  •  1
  •   Paulo Moura    6 年前

    有一些报告,包括在gnu prolog邮件列表中,在linux下出现了类似的错误,特别是ubuntu/kubuntu:

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

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

    推荐文章