要写出优秀的Prolog程序,程序员需要掌握哪些设计启发法?听说有经验的程序员需要大约两年时间才能熟练掌握Prolog。有效地使用递归是其中的一部分,但这似乎只是一个相对较小的障碍。究竟是什么让程序员遇到如此多的问题?我应该在示例代码中寻找什么来判断其质量?
要写出优秀的Prolog程序,程序员需要掌握哪些设计启发法?听说有经验的程序员需要大约两年时间才能熟练掌握Prolog。有效地使用递归是其中的一部分,但这似乎只是一个相对较小的障碍。究竟是什么让程序员遇到如此多的问题?我应该在示例代码中寻找什么来判断其质量?
坚持只编写纯的、单调的代码。只有当你了解两者时,才能判断选择哪一方。我假设你之前在某些命令导向语言中产生过副作用的经验,但没有使用纯代码的经验。因此,这意味着你将避免编写天然非单调的代码。
尝试使用toplevel。想象一下,toplevel是访问你的程序的唯一方式。如何设计问题使其符合这种格式?SWI、Scryer和Trealla toplevel专门设计为允许这种轻量级交互。
使用clpfd进行算术运算。不要使用(is)/2
,它会让你的代码变得太模式化。
享受纯的、单调的代码的代数特性。想一想:你添加一个目标,无论在哪里,你都可以预测这个目标将使你的程序专业化(并且最好保持原样)。你可以盲目地删除一个目标,而仍然知道(部分)它的影响。
研究failure-slice的概念以掌握非终止。
不要使用分步跟踪器/调试器,尽管它在许多Prolog中提供。它只会显示Prolog所采取的精确步骤。它不会直接显示与程序含义相关的任何内容。它强化了一种分步思维。
注意你的语言。你谈论程序的方式会影响你对它的思考方式。因此,如果你使用大量操作化的语言(比如:这个做这个等),那么你增强了命令导向视图。有一种更干净的谈论事物的方式,但你需要找到它。这可能是最难的部分。
append/3
的第一个参数为例:它不是坚定的,但定义仍然是单调的。 - false