什么!序言中的符号是什么意思?

What does ! symbol mean in prolog?

我真的很想知道这个符号在和符号之后是什么意思...例如看看这段代码

glitter(yes) :-
   agent_location(X, Y),
   gold(X, Y),
   ! . 

!符号代表the cut。您可以阅读有关 cut here 的更多信息。 此外,可以找到序言中的示例 here.

要理解“剪切”(!),您需要理解 Prolog 对其代码求值中涉及的回溯过程。正如您可能知道的那样,通过这段代码,Prolog 只知道当 X 和 Y 也用 [=14 验证时 agent_location(X, Y) 本身验证了带有输入 yes 的规则 glitter() =].换句话说,agent_locationgold 必须使用相同的参数进行验证。

这意味着 Prolog 将尝试找到 X 和 Y 的特定值,以便验证所有内容。它将沿着评估路径(评估树)向下并尝试 X 的值,看看是否可以使用相同的 X 值继续评估。如果失败(假设 Prolog 尝试 X = 0 in agent_locationX = 0 不验证 gold) 它会 返回 并尝试 agent_location 的另一个规则。那就是“剪辑”来的时候了。如果 ! 之后的某件事失败了,Prolog 将永远不会检查它是否可以用另一个规则解决 BEFORE 切割之前的所有内容。

在这个例子中,最终,如果那个特定的 glitter 规则的一切都失败了,Prolog 将想要尝试另一个规则来验证。我想您的原始代码为 glitter 指定了另一个规则,如果我没记错的话,您向我们展示的规则末尾的剪切意味着如果遵循此规则的规则失败,Prolog 将不会执行返回并检查它是否可以尝试新值来解决 glitter(yes).

通常用于提高计算效率和防止无限循环。