如何为Prolog使用有效的调试器/跟踪

时间:2017-03-17 18:50:37

标签: debugging prolog trace

我是Prolog的新手(开始学习两周),我们的任务涉及汉密尔顿路径,这会让我疯狂,特别是当我调试问题时。在haskell中,有一个调试跟踪,你可以这样做,每次一个函数运行时,它会吐出我想要的任何值,所以我知道发生了什么,发生了什么,并猜测数字在哪里乱七八糟。

Prolog中是否存在类似的内容?谷歌搜索它,但我做错了,因为到目前为止我没有运气。韦尔普。

2 个答案:

答案 0 :(得分:5)

有几种选择:

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中避免跟踪。两个独立的控制流程使得这种语言不太适合“单步”。好消息是,这也不是非常必要的:相反,通过推理程序的 generalizations specializations 来尝试声明性调试。这使您可以快速确定意外故障和不确定的真正原因。

跟踪总是会导致您对代码进行程序性思考,并且除了跟踪器中的错误之外,您还必须解决代码中的错误,同时只获得对代码中的错误的了解。你的程序的实际问题。

有关详细信息,请参阅示例

答案 1 :(得分:0)

此视频给出了在swi prolog中使用图形调试器的示例用法。 https://www.youtube.com/watch?v=Ap6o_mgbQIY&t=4s 基本上,使用gtrace进入跟踪模式,然后使用spacesf键导航跟踪r以重做失败的谓词e编辑跟踪中的代码。 a要中止。您还可以设置间谍点。 使用b进入另一个级别也很有用,因为您可以尝试其他查询,思考为什么您的代码有一个错误而不会丢失。 有时候你想跟踪,但正如Mat所说,如果你的代码是纯粹的,那么使用声明性调试技术是很好的,但是如果你的代码是非纯的,那么这种方法就行不通了。