鉴于以下事实:
pos(a,1).
pos(b,2).
pos(c,3).
Run Code Online (Sandbox Code Playgroud)
我想找到一个角色的位置.例如,pos(b,P)P = 2.
将这些事实转换为列表并进行成员资格检查是否更好,如下所示:
member(X/P,[a/1,b/2,c/3])
Run Code Online (Sandbox Code Playgroud)
我认为第一种选择更好,但任何人都可以解释每种方法的优缺点吗?
注意,这只是一个简单的例子.我会有很多事实,例如100-1000,并且必须多次检查,例如100k +.
列表意味着线性扫描。即,在最坏的情况下,定位元素的时间与列表中元素的数量成正比。但是对于静态谓词的事实,大多数 Prolog 实现在可能的情况下应用所谓的第一个参数索引,在这种情况下,当第一个参数实例化时,Prolog 可以为pos/2谓词调用正确的子句,而无需首先尝试(并失败)所有正确条款之前的条款。因此,您将线性时间 O(N) 访问与恒定时间访问 O(1) 进行比较。