运行单个非交互式SWI-Prolog查询时陷入无限循环问题求助
SWI-Prolog编译运行问题:无限循环与格式错误
问题代码
edge(1,2). edge(2,3). edge(3,4). connected(X,Y) :- edge(X,Y). connected(X,Y) :- edge(X,Z), connected(Z,Y). result :- connected(1,4). main :- format('%d', result).
执行命令与错误现象
编译命令:
swipl -nodebug -g true -O -q --toplevel=main --stand_alone=true -o main -c main.pl
运行可执行文件后报错并无限循环:
$ ./main ERROR: Format error: too many arguments ERROR: In: ERROR: [4] format('%d',result) %d # ... 上述3条错误信息无限重复输出 ...
问题分析
- 格式调用错误:
format('%d', result)存在两处问题:%d格式符要求传入数值类型参数,但result是一个谓词目标,不是数值;- SWI-Prolog的
format/2第二个参数应为参数列表,而非单个目标。
- 无限循环原因:由于指定了
--toplevel=main,当main谓词执行失败时,SWI-Prolog会不断重复调用main,导致错误信息无限输出。
解决方法
修改main谓词,先判断连接是否成立,再正确输出结果并终止程序:
edge(1,2). edge(2,3). edge(3,4). connected(X,Y) :- edge(X,Y). connected(X,Y) :- edge(X,Z), connected(Z,Y). main :- (connected(1,4) -> format('%d~n', [1]) % 连接成立输出1 ; format('%d~n', [0]) % 连接不成立输出0 ), halt. % 终止程序,避免重复执行
重新编译运行即可正常输出结果,不会陷入循环。
参考内容翻译
原Stack Overflow帖子核心内容:
- 使用
--stand_alone=true编译生成独立可执行文件时,需通过--toplevel=目标指定程序入口谓词; - 入口谓词执行完成后需调用
halt/0主动终止程序,否则程序可能因目标失败而重复执行,或进入交互式环境; - 编译时可搭配
-g true跳过初始目标执行,-q关闭冗余输出,-O开启优化。
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

