我觉得它很不直截了当,但我想我明白了它的要点,请确认我是否错了。
append([],L,L).
append([H|T],L2,[H|L3]) :- append(T,L2,L3).
这是关于规则和跟踪的查询。
?- append([a,b,c],[1,2,3],X)
append([a, b, c], [1, 2, 3], _G518)
append([b, c], [1, 2, 3], _G587)
append([c], [1, 2, 3], _G590)
append([], [1, 2, 3], _G593)
append([], [1, 2, 3], [1, 2, 3])
append([c], [1, 2, 3], [c, 1, 2, 3])
append([b, c], [1, 2, 3], [b, c, 1, 2, 3])
append([a, b, c], [1, 2, 3], [a, b, c, 1, 2, 3])
X = [a, b, c, 1, 2, 3]
yes
append(T,L2,L3), 向前“递归”,减小列表 [H|T] 的大小,然后 append([H|T],L2,[H|L3]) 向后“递归”,增加列表 L3 的大小。所以,如果我理解正确,规则总是向后“递归”,而它的条件总是向前“递归”,对吗?另外,是什么让算法向后追加“递归”?是追加([],L,L)吗?还是在达到基本情况后总是向后“递归”?
令人困惑的是,更简单的序言递归只会向前“递归”。如果我没记错的话,祖先(E,F)只会向前“递归”。