什么是'!'在Prolog做什么?

时间:2014-03-15 09:32:13

标签: prolog

我一直在跑这个运营商。下面是一个示例,一个使用插入排序对整数列表进行排序的谓词。

    inser(A,[],[A],P).
    inser(A,[H|L],R,P):- P(A,H),append([A,H],L,R),!.
    inser(A,[H|L],[H|R],P):- inser(A,L,R,P).

    sortin([],[],P).
    sortin([H|L],Re,P):- sortin(L,R,P),inser(H,R,Re,P).

我是Prolog的新手。

1 个答案:

答案 0 :(得分:3)

这被称为 cut 。引自SWI-Prolog documentation page

  

剪切。放弃自进入剪切出现的谓词后创建的所有选择点。换句话说,提交剪切出现的子句并丢弃当前子句中剪切左侧目标创建的选择点

该名称是描述性的WRT Prolog的抽象计算模型,它构建一个证明树,试图以明确定义的顺序满足所有条件。削减修剪潜在分支,应用替代规则可能需要。

在你的inser / 3谓词中,这意味着第三个句子将尝试如果 P(A,H)成功追加([A,H],L,R)也成功。

请注意,P(A,H)无效Prolog语法。您应该使用call(P,A,H)来调用P比较谓词。