我对 Prolog 很陌生(开始学习两周左右),我们涉及哈密尔顿路径的作业会让我发疯,尤其是当我调试问题时。在 haskell 中,你可以进行调试跟踪,这样每次函数运行时,它都会输出我想要的任何值,这样我就知道什么进入、什么出去,并猜测数字在哪里出了问题。
Prolog 中是否存在类似的东西?谷歌搜索了一下,但我做错了,因为到目前为止我还没有运气。韦尔普。
最佳答案
有几个选项:
0。 “穷人的痕迹”:不纯的输出
您可以使用不纯谓词(例如format/2
)从程序中发出调试信息。
示例:
?- X = 4, format("X is now: ~w\n", [X]). X is now: 4
这可能与您用其他语言生成的跟踪类似。
这是最不先进和最差的调试方法,也是最流行的。
1。文本跟踪器:trace/0
在您的 Prolog 系统中尝试一下:
?- trace, your_goal.
然后痛苦地单步调试代码。
这肯定会让你尽快发疯。
2。图形跟踪器
一些 Prolog 系统提供图形跟踪器。
例如,在 SWI-Prolog 中,尝试:
?- gtrace, your_goal.
图形跟踪器是一个相当复杂的程序,并且本身存在错误。
3。声明式调试强烈推荐
总的来说,我强烈建议避免在 Prolog 中进行跟踪。两个独立的控制流程使得这种语言不太适合“单步执行”。好消息是,这也不是很有必要:相反,可以通过推理程序的泛化和特化来尝试声明式调试。这使您可以快速确定意外失败和不终止的真正原因。
跟踪总是会引导您按程序思考您的代码,除了跟踪器中的错误之外,您还必须努力解决代码中的错误,同时只能获得很少的洞察力您的程序的实际问题。
例如参见program-slicing和 failure-slice了解更多信息。
关于debugging - 如何为 Prolog 使用有效的调试器/跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42865128/