我有一个问题,我想问你一些代码片段:
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
该功能非常清楚地将项添加到优先级队列中。我遇到的问题是第一行中的切断操作符。大概每当呼叫到达这行代码时,这是查询的唯一可能解决方案,并且函数调用将简单地展开(或者它是否结束?),没有必要回溯跟踪并搜索另一个解决方案。查询。
所以这里的切断是多余的。我的演绎是否正确?
答案 0 :(得分:1)
是的,任何半体面的Prolog编译器都会注意到没有其他子句,其中第二个参数是空列表。
在第二个句子的末尾会更有用,但我宁愿结合第二个和第三个子句并使用局部剪切(先于(...) - &gt; ...; ... )。
答案 1 :(得分:1)
编译器用户消除候选谓词以进行匹配的特定技术称为参数索引。默认情况下,不同的prolog实现可能会索引不同数量的参数。
因此,如果您担心参数是否被编入索引,那么您应该检查您使用索引的索引的参数数量。根据{{3}},它只默认索引第一个参数。因此,在您的情况下,切割实际上并不是多余的。但是,您可以使用在上述链接中链接的谓词index/1
和hash/1
明确规定应将哪些参数编入索引。
或者你可以重新排序参数,或者你可以保持削减。
答案 2 :(得分:0)
是的,你是对的。即使编译器不是半正式的(SWI Prolog当然也是如此),它能做的最糟糕的事情就是匹配第二和第三个条款,这些条款将立即失败。
但是,如果第二个子句匹配,则第三个子句也匹配。这是预期的行为吗?