首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >整数平方根在SWI-Prolog和YAP中工作,但在GNU-Prolog中不工作。

整数平方根在SWI-Prolog和YAP中工作,但在GNU-Prolog中不工作。
EN

Stack Overflow用户
提问于 2018-12-09 02:25:04
回答 1查看 258关注 0票数 0

我测试了以下代码,方法是将它添加到swipl、gprolog和yap中的用户文件中:

代码语言:javascript
运行
复制
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的以下错误消息:

代码语言:javascript
运行
复制
uncaught exception: error(existence_error(procedure,isqrt/0),isqrt/0)

这对我来说很奇怪,因为我的代码中没有一个谓词依赖于isqrt/0。这会是中的一个bug吗?作为一个解决办法,我能做些什么?

编辑:下面正是我在ubuntu上的gprolog中生成这个错误的方法:

代码语言:javascript
运行
复制
$ 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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-09 17:29:12

有一些报告,包括GNU Prolog邮件列表中的报告,在Linux下也有类似的错误,特别是Ubuntu/kubuntu:

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53688854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档