我的讲师给了我们这个示例程序来查看代码,而我理解整个递归函数就是这一行我无法理解
的含义all_different([H | T]) :- member(H, T), !, fail.
从递归函数中提取:
all_different([H | T]) :- member(H, T), !, fail.
all_different([_ | T]) :- all_different(T).
all_different([_]).
所有我理解的是它将一个列表分成头H和尾T并检查T是否包含在T中...我的问题是,它是什么“!”和“失败”吗?
答案 0 :(得分:3)
这些对Prolog来说非常重要。
fail
至关重要。它迫使Prolog认为当前分支失败并启动回溯。
!
被称为“削减”。它将Prolog提交给当前分支。或者,它根据当前规则修剪选择点的踪迹。
与此同时,在Prolog-ese中,这表示“如果列表的头部出现在列表的尾部,则无需寻找任何其他答案,并且失败。”因此,如果列表的其余部分出现在列表的其余部分中,您将立即失败并且无法回溯。这实际上并不是那么可怕,只是意味着Prolog不会再浪费时间来弄清楚列表是否是“all_different”。回溯将在通话现场正常恢复。
重要的是这些按此顺序排列。如果你在失败后试图削减,你永远不会削减它,因为回溯已经开始了。如果省略剪切,如果列表中有任何满足属性的子列表,则谓词将返回true。这保证是最后一个子句的任何非空列表的情况,它声明具有一个元素的列表满足该属性。如果省略失败,那么您只需为子列表中列表的每个元素获得一个成功,另外一个用于尾部。我鼓励你尝试使用谓词,进行这些更改并查看效果,因为它将大大有助于说明切割和失败的目的。