Prolog效率:事实统一还是列表成员?

时间:2014-03-14 13:16:52

标签: prolog

鉴于以下事实:

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 +。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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