【问题标题】:How to use an effective debugger/trace for Prolog如何为 Prolog 使用有效的调试器/跟踪
【发布时间】:2017-03-17 18:50:37
【问题描述】:

我对 Prolog 很陌生(开始学习两周时间),我们的任务涉及到汉密尔顿路径,这让我发疯,尤其是在调试问题时。在 haskell 中,您可以进行调试跟踪,这样每次函数运行时,它都会输出我想要的任何值,这样我就知道输入了什么,输出了什么,并猜测数字在哪里变得混乱。

Prolog 中是否存在类似的东西?谷歌搜索,但我做错了什么,因为到目前为止我没有任何运气。求救。

【问题讨论】:

  • 更多信息请见this

标签: debugging prolog trace


【解决方案1】:

有几种选择:

0。 “穷人的踪迹”:不纯的输出

您可以使用 impure 谓词(如 format/2)从您的程序中发出调试信息。

例子:

?- X = 4, format("X is now: ~w\n", [X]). X 现在是:4

这可能与您用其他语言生成的痕迹相似。

这是最不先进和最差的调试方法,也是最流行的。

1。文字追踪器:trace/0

在您的 Prolog 系统中尝试:

?- trace,your_goal。

然后痛苦地单步执行代码。

这是让你尽快发疯的可靠方法。

2。图形示踪剂

一些 Prolog 系统提供图形跟踪器

例如,在 SWI-Prolog 中,尝试:

?- gtrace,your_goal。

图形跟踪器是一个相当复杂的程序,并且本身也有错误

3。声明式调试强烈推荐

总的来说,我强烈建议避免在 Prolog 中跟踪。两个独立的控制流使得这种语言不太适合“单步执行”。好消息是这也不是很有必要:相反,通过推理您的程序的泛化专业化来尝试声明式调试。这使您可以快速确定意外失败和未终止的真正原因。

总是,跟踪会引导您以程序方式考虑您的代码,除了跟踪器中的错误之外,您还必须与代码中的错误作斗争,而对代码的了解却很少。程序的实际问题。

请参阅 了解更多信息。

【讨论】:

  • 您知道跟踪器中有哪些错误?
  • 例如,在 SWI 中,突出显示和单步执行 catch/3 中包含的代码存在无数问题。在许多情况下,涉及约束的代码也没有得到正确处理。声明式调试更加可靠且可移植!
  • 我是 Prolog 的新手,但是拥有一个可以绘制树的调试器似乎很自然。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 2016-02-19
    • 2016-10-15
    相关资源
    最近更新 更多