什么是设计启发人们必须掌握写好序言? 我听说它需要两年左右的有经验的程序员在序言成为精通。 有效地使用递归是其中的一部分,但是这似乎是一个相对较小的障碍。 究竟是什么,为程序员提供了这么多麻烦? 我应该寻找在示例代码来判断它的质量?
Answer 1:
在编写好的代码的Prolog的主要困难在于不仅理解,而且充分地传送节目的意图或目的。 与其他编程语言中经常出现同一个程序中的几个完全不同类型的Prolog的代码。 通过混淆这样的水平错误和问题随之而来:
纯净的,单调的代码。 此代码位于在序言的心脏。 在这样的代码很多代数性质的保持,和实际的问题,其中的Prolog通常与通告的纯的,理想的方式描述。 然而,即使在这样的部件的某些程序属性可能表面上,例如非终止。 以一个例子结合的交换性。 在纯的,单调代码, ( A, B )
和( B, A )
描述相同的关系。 唯一的区别可能在于不同的终止行为和答案的显示顺序。 理想的情况下,纯谓词的名字传达的谓词关系。 当务之急是绝对不会在这里一个不错的选择。
侧effectful代码。 另一个极端是,可以仅通过执行有效这样理解代码,或者通过机器或在脑海中。 有在程序中没有简单的变量。 但是,即使在这样的地区,有可能仍像坚定性观察到某些属性。 有效这样的代码是不是其他编程语言非常不同。
通常,侧effectful部分“吃掉”了纯真的一面,因为程序员用来势在必行,面向命令 - 执行 - 这个做,这种思维。 要瘦成另一个方向上,认为其性能,你会失去或获得。 认为这将是多么容易的测试程序:本素净的程序它是更容易测试周围没有任何额外的沙盒。 一个简单的顶层查询是不够好。
一些例子,如何纯真的一面可以在看似必要的副作用为代价来扩大:
有什么优点和使用手动列表迭代VS递归的利弊通过失败
Prolog的递归跳过相同的结果
或者干脆这些问题的答案 。
编辑:在您的评论,你问“建议学习”。 因此,这里是一些:
坚持只写纯,单调的代码。 你只能判断选择一种或另一边,如果你知道这两个。 我假定你有一些面向命令语言的一些以前的生产经验的副作用,但没有用纯代码。 因此这将意味着你会从本质上写非单调代码避免。
与顶层播放。 试想一下,顶层是访问你的程序的唯一途径。 你将如何制定的问题,使得它适合这种格式? 的SWI顶层已被专门设计以允许这样的轻量的相互作用。
使用clpfd用于算法。 不要使用
(is)/2
,它使你的代码太moded。享受纯粹的,单调的代码代数性质。 想想看:你添加一个目标,无论在哪里,而且还可以预测,这一目标将专注你的程序(和最好离开它是)。 你可以 - 盲目 - 删除一个目标,还是你知道(的一部分),它的作用。
研究A的概念故障切片掌握未结束。
不要使用一步一步追踪/调试器,因为它是在许多Prologs提供。 那只能说明你的具体步骤Prolog的需要。 它不显示你什么直接关系到节目的意义。 它强化了一步一步的思考。
注意你说的话。 你如何谈论节目的方式影响你想想它的方式。 所以,如果你使用了大量投入运作的语言(如:这确实这等),机会是你加强面向命令的视图。 有谈论事情的更清洁的方式,但你需要找到它。 这可能是最难的部分。