我是Prolog的新手(开始学习两周),我们的任务涉及汉密尔顿路径,这会让我疯狂,特别是当我调试问题时。在haskell中,有一个调试跟踪,你可以这样做,每次一个函数运行时,它会吐出我想要的任何值,所以我知道发生了什么,发生了什么,并猜测数字在哪里乱七八糟。
Prolog中是否存在类似的内容?谷歌搜索它,但我做错了,因为到目前为止我没有运气。韦尔普。
答案 0 :(得分:5)
有几种选择:
您可以使用不纯的谓词(如format/2
)从您的程序中发出调试信息。
示例:
?- X = 4, format("X is now: ~w\n", [X]). X is now: 4
这可能类似于您用其他语言制作的痕迹。
这是最不发达且最差的调试方法,也是最受欢迎的。
trace/0
在Prolog系统中尝试使用:
?- trace, your_goal.
然后痛苦地逐步完成代码。
这是一种尽可能快地疯狂的可靠方法。
一些Prolog系统提供图形跟踪器。
例如,在SWI-Prolog中,尝试:
?- gtrace, your_goal.
图形跟踪器是一个非常复杂的程序,并且自己有错误。
总的来说,我强烈建议在Prolog中避免跟踪。两个独立的控制流程使得这种语言不太适合“单步”。好消息是,这也不是非常必要的:相反,通过推理程序的 generalizations 和 specializations 来尝试声明性调试。这使您可以快速确定意外故障和不确定的真正原因。
跟踪总是会导致您对代码进行程序性思考,并且除了跟踪器中的错误之外,您还必须解决代码中的错误,同时只获得对代码中的错误的了解。你的程序的实际问题。
有关详细信息,请参阅示例program-slicing和failure-slice。
答案 1 :(得分:0)
此视频给出了在swi prolog中使用图形调试器的示例用法。 https://www.youtube.com/watch?v=Ap6o_mgbQIY&t=4s
基本上,使用gtrace进入跟踪模式,然后使用space
和s
和f
键导航跟踪r
以重做失败的谓词e
编辑跟踪中的代码。 a
要中止。您还可以设置间谍点。
使用b
进入另一个级别也很有用,因为您可以尝试其他查询,思考为什么您的代码有一个错误而不会丢失。
有时候你想跟踪,但正如Mat所说,如果你的代码是纯粹的,那么使用声明性调试技术是很好的,但是如果你的代码是非纯的,那么这种方法就行不通了。