运行SWI-Prolog Simplex库coins示例时出现rationalize/1函数错误
解决SWI-Prolog simplex库coins示例的报错问题
你在运行simplex库的coins示例时遇到了两个问题:一个拼写错误警告,一个算术函数缺失的报错,咱们一步步来解决:
1. 处理开头的拼写警告
你看到的Warning: /home/vitorferraz/junk/coins.pl:1: Unknown message: simlpex(bounded)是因为拼写失误——把simplex写成了simlpex。打开你的coins.pl文件第一行,修正这个拼写错误,把simlpex改成simplex,这个警告就会消失。
2. 解决核心的rationalize/1报错
这个错误Arithmetic: 'rationalize/1' is not a function是因为你使用的SWI-Prolog版本(7.6.4)太旧了,rationalize/1是在SWI-Prolog 8.0及以后的版本才加入的内置算术函数,当前版本没有这个函数,导致simplex库调用时失败。
有两种可行的解决办法:
- 升级SWI-Prolog版本:直接把SWI-Prolog升级到8.0或更高的稳定版本,新版本已经内置了这个函数,升级后再运行示例就能正常工作。
- 手动实现
rationalize/1:如果暂时无法升级,可以在你的coins.pl文件开头添加以下代码,手动实现这个函数的基础功能,让simplex库能正常调用:% 适配旧版本SWI-Prolog的rationalize/1基础实现 rationalize(R) :- rational(R), !. rationalize(F) :- float(F), R is rational(F), rationalize(R). rationalize(N) :- integer(N), !.
你遇到的完整错误信息回顾
$ rlwrap swipl coins.pl Warning: /home/vitorferraz/junk/coins.pl:1: Unknown message: simlpex(bounded) Welcome to SWI-Prolog (threaded, 64 bits, version 7.6.4) SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software. Please run ?- license. for legal details. For online help and background, visit http://www.swi-prolog.org For built-in help, use ?- help(Topic). or ?- apropos(Word). 1 ?- coins(S), variable_value(S, c(1), C1), variable_value(S, c(5), C5), variable_value(S, c(20), C20). ERROR: Arithmetic: `rationalize/1' is not a function ERROR: In: ERROR: [13] _5574 is rationalize(111) ERROR: [12] simplex:constraint_(0,[...|...]=111,state(0,[],[],[]),_5616) at /usr/local/lib/swipl-7.6.4/library/clp/simplex.pl:636 ERROR: [10] coins(state(0,[],[],[]),_5664) at /home/vitor/coins.pl:8 ERROR: [8] '<meta-call>'(user:(...,...)) <foreign> ERROR: [7] <user> ERROR: ERROR: Note: some frames are missing due to last-call optimization. ERROR: Re-run your program in debug mode (:- debug.) to get more detail.
内容的提问来源于stack exchange,提问作者Vitor F.M.
相关产品推荐
相关产品推荐

