使用失败的切割

2024 年 8 月 29 日 | 阅读 2 分钟

在本节中,我们将指定“cut”的另一种用途。它用于指定一般规则的例外情况。在下面的示例中,我们在数据库中包含鸟类的名称,如下所示

以下显示了添加此项的自然规则

上面的规则意味着“所有鸟类都可以飞翔”。

上述规则非常笼统。我们不能保证目标 cry_fly(penguins) 总是失败吗?因此,我们将按照以下方法更改谓词 can_fly 的定义

但是,以上并没有提供期望的结果

第一个 can_fly 子句的头部和目标 can_fly(penguins) 相互匹配。在该子句的主体中,我们尝试满足该目标,而该目标显然失败。现在,系统查看第二个 can_fly 子句。头部和目标相互匹配,并且目标也在子句的主体中得到满足,即 bird(A),因此目标 can_fly(penguins) 成功。但这并不是期望的结果。

我们可以通过替换子句 can_fly 来实现期望的结果,替换为


与之前一样,第一个 can_fly 子句的头部和目标 can_fly(penguins) 相互匹配。在该子句的主体中,我们尝试满足该目标,而该目标显然失败。但在这里,切割会阻止系统回溯,因此目标 can_fly(penguins) 失败。

使用失败的切割fail 和目标 ! 的组合。