【发布时间】:2011-04-28 09:58:03
【问题描述】:
我是 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]
有人可以帮助我了解找到解决方案的工作方式吗?我的意思是我想逐步了解它是如何执行以提出解决方案的。
【问题讨论】:
标签: prolog