Prolog程序的复杂性?

时间:2009-11-22 00:15:57

标签: algorithm prolog complexity-theory

在Prolog中,使用回溯来解决问题。它是一种声明性范式,而不是命令式范式(如C,PHP或Python)。在复杂性方面,这种语言是否值得思考?

你认为问题的自然方式似乎是某人在this question中指出的O(N ^ 2)。

3 个答案:

答案 0 :(得分:4)

您可以像任何其他语言一样分析Prolog程序的复杂性。您链接的特定问题可能是O(n ^ 2)。但并非所有Prolog程序都具有这种复杂性。例如,您可以在Prolog中轻松编写SAT求解器,并且该问题是NP-Complete。

答案 1 :(得分:4)

完全取决于问题。

e.g。总结一个数字列表是O(N),据我所知。

sum([],0).
sum(List,Total) :-
   sum(List,0,Total).

sum([],Total,Total).
sum([Head|Rest],Accumulator,Total) :-
    SoFar is Head + Accumulator,
    sum(Rest,SoFar,Total).

唯一的操作是添加(“是”)和递归调用,每个都应该值1。它们都将在列表中的每个项目中执行〜一次,因此总动作应为~2N,即O(N)。

答案 2 :(得分:1)

分析任何语言中的复杂性非常重要,无论是prolog还是任何命令式语言。但是我可以给你一些加速你的prolog程序的技巧

  1. 始终始终尝试使程序拖尾递归。这将确保您的程序不会耗尽堆栈。
  2. 尝试在您不需要任何进一步答案的程序中使用剪切和失败。
  3. 尝试使用准确者。
  4. 查看CLPFD,它有助于大幅减少搜索空间,从而加快程序的运行速度。从本质上讲,它可以在您的程序回溯并浪费时间探索这些选择之前消除错误的选择。
  5. 始终先写出最佳结果规则。 (这实际上取决于问题,但通常最好的情况规则先行。)