我才意识到这是一个愚蠢的问题。好奇是否有人仍然可以找到漏洞。
源代码:
married(trump,obama).
married(trump,goat).
married(pepee,pepper).
married(X,Y) :- married(Y,X),!. % not awesome because of infinite recursion
Goal: ex. married(trump, putin).
trace(
first base case fails.
second base case fails.
third base case fails.
married(trump,putin) = married(putin,trump),!.
我想要它做的是再次尝试结婚(普京,特朗普),但所有早期的基本案例都会再次失败。我们之前尝试过切换参数但失败了。所以不要递归。只返回假。
我收到堆栈错误,因为直到结婚(普京,特朗普)或其他方式之前!永远不会返回 true 或 false,因此 cut 将无法触发。
更简单和更理智的方法是重写代码以防止递归。我很好奇是否有办法尝试切换 args 一次,如果失败则返回失败。如果您有很长的事实列表,如果您可以尝试 arg1、arg2,则可以将该长列表减少一半,反之亦然。如果我们得到疯狂的排列场景,可能会呈指数级增长。
任何见解都会非常感谢。