【问题标题】:Prolog efficiency: facts unification or list membership?Prolog效率:事实统一还是列表成员?
【发布时间】:2014-03-14 13:16:51
【问题描述】:

鉴于这些事实:

pos(a,1).
pos(b,2).
pos(c,3).

我想找到一个角色的位置。例如,pos(b,P)P=2。

将这些事实转换为列表并进行成员资格检查是否更好,如下所示:

member(X/P,[a/1,b/2,c/3])

我认为第一种选择更好,但谁能解释每种方法的优缺点?

注意,这只是一个简单的例子。我将有很多事实,例如 100-1000,并且必须多次进行此检查,例如100k+。

【问题讨论】:

    标签: prolog


    【解决方案1】:

    列表意味着线性扫描。 IE。在最坏的情况下,定位元素的时间与列表中元素的数量成正比。但是对于静态谓词的事实,大多数 Prolog 实现尽可能应用所谓的第一个参数索引,在这种情况下,当第一个参数是在没有首先尝试(并且失败)正确的子句之前的所有子句的情况下进行实例化。因此,您正在比较线性时间 O(N),访问恒定时间访问 O(1)。

    【讨论】:

    • 如果第一个参数是列表,是否应用第一个参数索引?例如pos([a,1]).
    • 这有时被称为“深度索引”,但我不知道有任何编译器这样做,尽管在一些邮件列表中已经讨论过它。但是请注意,第一个参数索引通常可以区分空列表(实际上,它不是列表)和非空列表。还要注意,现在一些 Prolog 编译器提供了多参数索引(有或没有一些谓词声明),但在编写可移植代码时,你唯一可以期望的就是第一个参数索引。
    【解决方案2】:

    使用事实应该更有效(尽管只有 3 个项目,差异可能可以忽略不计)。所有 prolog 都是建立在查找事实/规则的基础上的,因此它需要非常高效。使用列表更灵活;例如,以这种方式在一组事实之间切换会更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多