好的Prolog代码的特点?

时间:2013-03-29 19:04:16

标签: prolog failure-slice logical-purity

有什么设计启发式来掌握好的Prolog?我听说需要一名经验丰富的程序员大约两年才能熟练掌握Prolog。有效地使用递归是其中的一部分,但这似乎是一个相对较小的障碍。究竟是什么给程序员带来了这么多麻烦?我应该在示例代码中查找什么来判断其质量?

1 个答案:

答案 0 :(得分:20)

编写好的Prolog代码的主要困难不仅在于理解,还在于充分传达程序的意图或目的。与其他编程语言相比,在同一程序中通常有几种完全不同的Prolog代码。通过混淆这些级别的错误和问题随之而来:

纯粹,单调的代码。 此代码位于Prolog的核心。在这样的代码中,许多代数属性成立,并且实际问题以Prolog经常被广告的纯粹,理想的方式描述。然而,即使在这些部分中,某些程序性质也可能浮出水面,例如不终止。以连词的可交换性为例。在纯粹的单调代码中,( A, B )( B, A )描述了相同的关系。唯一的区别可能在于不同的终止行为和答案的出现顺序。理想情况下,纯谓词的名称表示谓词是关系。这里的命令绝对不是一个好选择。

有效的代码。 另一个极端是只能通过机器或心灵有效地执行它来理解的代码。程序中没有简单的不变量。但即使在这些部件中,仍然可能存在某些特性,如坚定性。实际上,此类代码与其他编程语言没有太大区别。

通常情况下,副作用部分“吃掉”纯粹的一面,因为程序员习惯于命令式的,以命令为导向的做法 - 这就是思考。要向另一个方向倾斜,请考虑您将失去或获得哪些属性。想想测试程序是多么容易:程序越纯,就越容易测试,没有任何额外的沙盒。一个简单的顶级查询就足够了。

一些例子,如何以牺牲看似必要的副作用为代价来扩展纯粹的一面:

或只是these answers

编辑:在您的评论中,您要求“学习建议”。所以这里有一些:

  1. 坚持只编写纯粹的单调代码。如果你们两个都知道,你只能判断选择一方或另一方。我假设你有一些以前的经验,在一些面向命令的语言中产生副作用,但没有纯代码。因此,这意味着您将不会编写固有的非单调代码。

  2. 玩顶级游戏。想象一下,toplevel是访问程序的唯一方法。你会如何形成一个问题,使其符合这种格式? SWI顶层经过专门设计,可以实现轻量化的交互。

  3. 使用进行算术运算。不要使用(is)/2,这会使您的代码过于模糊。

  4. 享受纯单调代码的代数属性。想一想:你添加一个目标,无论在哪里,你仍然可以预测这个目标将专门化你的程序(并且最好保持原样)。你可以 - 盲目地 - 删除一个目标,但你仍然知道(部分)其效果。

  5. 研究掌握非终止的概念。

  6. 不要使用逐步跟踪器/调试器,因为它在许多Prolog中提供。它只显示Prolog采取的精确步骤。它没有向您显示与程序含义直接相关的任何内容。它强化了一步一步的思考。

  7. 观看您的语言。你如何谈论一个程序的方式会影响你对它的看法。因此,如果您使用大量的操作语言(例如:这样做等),您可能会强化面向命令的视图。有一种更清洁的方式来谈论事物,但你需要找到它。这可能是最难的部分。