SWI-Prolog查询未返回全部预期结果问题求助
SWI-Prolog变量显示差异问题解答
嘿,这个问题我刚学Prolog的时候也踩过坑!先给你吃颗定心丸:你得到的point(5,6058)和教程里的point(5, _)本质上是同一个结果,只是SWI-Prolog的默认显示方式不一样而已。
问题原因
你看到的6058是SWI-Prolog给未绑定变量自动分配的内部标识符,它代表这个位置的值可以是任意的,和教程里的_(匿名变量)逻辑完全等价。不同Prolog环境(或不同版本的SWI-Prolog)对未绑定变量的默认显示规则不同:
- 有些教程里的环境默认将未绑定的匿名变量显示为
_; - 而当前版本的SWI-Prolog默认会给未绑定变量分配一个唯一的数字后缀标识符(比如
_6058,有时候会省略下划线直接显示数字),看起来像是“具体值”,但其实它还是一个可以匹配任意值的变量。
至于“首次运行后输出变化一次之后保持不变”:这是因为SWI-Prolog会缓存这些变量标识符,第一次启动环境时分配新的标识,后续查询会复用或递增标识,但这完全不影响逻辑正确性。
解决方法(让显示和教程一致)
如果你想让查询结果显示成point(5, _)的样式,只需要在SWI-Prolog的提示符里执行以下设置命令:
set_prolog_flag(toplevel_print_anon, true).
执行完这个命令后,再运行你的查询vertical(line(point(5, 10), X)).,就会得到和教程一样的输出:X = point(5, _)。
另外,你也可以通过显式查询来验证规则的正确性:
vertical(line(point(5,10), point(5, _))).
Prolog会返回true,证明所有X坐标为5的点都符合垂直的规则。
确认你的代码正确性
你的规则定义vertical(line(point(X, Y), point(X, Y2))).是完全正确的——它准确描述了垂直线的条件:两个点的X坐标相同,Y坐标可以是任意值。所以你的查询逻辑没有问题,只是显示方式的差异。
内容的提问来源于stack exchange,提问作者Nezhaii
相关产品推荐
相关产品推荐

