我是 Prolog 的初学者,发现在使用规则时很难理解回溯是如何工作的。我什至不知道回溯是否适用于规则(想正确了解它)。我有以下程序将列表中的所有偶数相加。我自己写的,但发现很难理解找到解决方案所需的步骤。evenN(X):- (X mod 2) =:= 0.sumEven([], 0).sumEven([H|T], X):- evenN(H), sumEven(T,Y), X is Y+H.sumEven([H|T], X):- \+evenN(H), sumEven(T,X).输出:::?- sumEven([1,2,3,4,5,6],X).X = 12需要帮助才能更好地理解它。我尝试使用跟踪实用程序来理解输出,但我不明白,这就是为什么在这里问它。 问题:1)当我注释掉第二条规则(最后一行)时,它给了我失败的答案,因为 1 不是偶数并且整个 sumEven() 失败,因为我理解的 evenN() 失败。我的问题是:之后会发生什么?它会回到顶部并尝试 sumEven([], 0) 事实还是?我只是想知道会发生什么。2)当包含最后一行(第二条规则)并且第一条规则失败时,当它回溯时,它是否会寻找跟随它的另一个 sumEven()(就像第二条规则遵循失败的第一条规则的方式)还是返回到顶部并测试 sumEven([], 0) 事实并从那里开始?我需要了解在 prolog 中特别是在这样的递归情况下使用规则时它是如何回溯的。3)我在网上找到了以下代码(递归)。它将列表分为肯定列表和否定列表。% predicates split(list,list,list)% clauses split([],[],[]). split([X|L],[X|L1],L2):- X>= 0, !, split(L,L1,L2). split([X|L],L1,[X|L2]):- split(L,L1,L2).Output :Goal: split([1,2,-3,4,-5,2],X,Y)X=[1,2,4,2], Y=[-3,-5]有人可以帮助我了解找到解决方案的工作方式吗?我的意思是我想逐步了解它是如何执行以提出解决方案的。 最佳答案 看看您是否能掌握 Ivan Bratko 的“人工智能 Prolog 编程”。他解释了 Prolog 为很好地满足目标而遵循的过程。我将尝试单独回答您的问题:clause 1: evenN(X):- (X mod 2) =:= 0.clause 2: sumEven([], 0).clause 3: sumEven([H|T], X):- evenN(H), sumEven(T,Y), X is Y+H.clause 4: sumEven([H|T], X):- \+evenN(H), sumEven(T,X).问题:1)当我注释掉第二条规则(最后一行)时,它给了我失败的答案,因为 1 不是偶数,并且整个 sumEven() 失败,因为我理解的 evenN() 失败。我的问题是:之后会发生什么?它会回到顶部并尝试 sumEven([], 0) 事实还是?我只是想知道会发生什么。 A: 您注释掉子句 4。Prolog 尝试满足目标,首先尝试子句 2,由于列表不为空而失败,然后尝试子句 3,当 H 为奇数时,它在规则 1 上失败。它现在将尝试在第 3 条之后找到另一个子句(它不会回溯到第 3 条之前),因为您将其注释掉,该子句将失败,因此目标失败。2)当包含最后一行(第二条规则),并且第一条规则失败时,当它回溯时,它是否会寻找跟随它的另一个 sumEven()(就像第二条规则遵循失败的第一条规则的方式)或它回到顶部并测试 sumEven([], 0) 事实并从那里开始? A: 不,当第 3 条失败时它不会回溯,而是继续执行下一个子句 (4)。我需要了解在 prolog 中特别是在这样的递归情况下使用规则时它是如何回溯的。 A :如果规则 evenN(H) 成功,则 sumEven(T, Y) 再次使用 T 和 Y 从第 2 条开始整个过程​​。如果 sumEven(T,Y) 由于某种原因失败,第 3 条将失败,Prolog 回溯并try 子句 4. 如果当前调用是 sumEven([2,3,...],X) 并且 sumEven([3,...],Y) 由于某种原因失败,Prolog 将回溯并尝试找到另一个子句sumEven([2,3,...],X) 从第 3 条开始。3)我在网上找到了以下代码(递归)。它将列表分为肯定列表和否定列表。clause 1: split([],[],[]).clause 2: split([X|L],[X|L1],L2):- X>= 0, !, split(L,L1,L2).clause 3: split([X|L],L1,[X|L2]):- split(L,L1,L2).有人可以帮助我了解找到解决方案的工作方式吗?我的意思是我想逐步了解它是如何执行以提出解决方案的。 A :我将使用更短的目标分割(numlist、PosList、NegList)和 numlist = [1,-1,2,-2]。非常粗略地它的工作原理如下(它实际上使用一个堆栈来放置匹配的值,并且只有在它展开这个堆栈时它的目标最终成功时才实例化变量 - 有关更详细的信息,请参阅 Bratko 书):第 1 条失败,因为 numlist 不为空。第 2 条适用于: split([1|-1,2,-2],[1|L1],[Y|L2]) - 因为 1 >=0 PosList 现在将是 [1],而 split 将是应用于 numlist=[-1,2,-2] 的尾部。第 1 条再次失败。第 2 条适用于 split([-1|2,-2],[-1| L1],[Y|L2]) - 由于 -1 第 1 条不合格;第 2 条成功,PosList 变为 [1,2],拆分应用于 numlist=[-2]。第 1 条和第 2 条失败;第 3 条成功,NegList 变为 [-1,-2]。 numlist 的尾部为空,第 1 条成功,返回 PosList=[1,2] 和 NegList[-1,-2]。关于prolog - 需要帮助理解 Prolog 中的内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5816801/
10-10 17:27