好的Prolog代码的特点?

use*_*424 8 prolog failure-slice logical-purity

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

fal*_*lse 20

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

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

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

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

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

或者只是这些答案.

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

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

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

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

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

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

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

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

  • @ user287424:我提出了一个问题:你会丢失或获得多少属性?代码测试有多容易?这也有可能为您解答,尽管需要一些时间来详细考虑它.经验使这当然更容易,更快,但你可以从这开始. (2认同)