prolog切断了方法

时间:2009-11-13 16:17:58

标签: prolog logic

我有一个问题,我想问你一些代码片段:

insert_pq(State, [], [State]) :- !.
insert_pq(State, [H|Tail], [State, H|Tail]) :-
    precedes(State, H).
insert_pq(State, [H|T], [H|Tnew]) :-
    insert_pq(State, T, Tnew).
precedes(X, Y) :- X < Y.  % < needs to be defined depending on problem

该功能非常清楚地将项添加到优先级队列中。我遇到的问题是第一行中的切断操作符。大概每当呼叫到达这行代码时,这是查询的唯一可能解决方案,并且函数调用将简单地展开(或者它是否结束?),没有必要回溯跟踪并搜索另一个解决方案。查询。

所以这里的切断是多余的。我的演绎是否正确?

3 个答案:

答案 0 :(得分:1)

是的,任何半体面的Prolog编译器都会注意到没有其他子句,其中第二个参数是空列表。

在第二个句子的末尾会更有用,但我宁愿结合第二个和第三个子句并使用局部剪切(先于(...) - &gt; ...; ... )。

答案 1 :(得分:1)

编译器用户消除候选谓词以进行匹配的特定技术称为参数索引。默认情况下,不同的prolog实现可能会索引不同数量的参数。

因此,如果您担心参数是否被编入索引,那么您应该检查您使用索引的索引的参数数量。根据{{​​3}},它只默认索引第一个参数。因此,在您的情况下,切割实际上并不是多余的。但是,您可以使用在上述链接中链接的谓词index/1hash/1明确规定应将哪些参数编入索引。

或者你可以重新排序参数,或者你可以保持削减。

答案 2 :(得分:0)

是的,你是对的。即使编译器不是半正式的(SWI Prolog当然也是如此),它能做的最糟糕的事情就是匹配第二和第三个条款,这些条款将立即失败。

但是,如果第二个子句匹配,则第三个子句也匹配。这是预期的行为吗?