【发布时间】:2018-02-26 05:54:15
【问题描述】:
我正在学习 Prolog,但我在递归方面遇到了困难。数据库的简单案例我可以理解,但我不能按照这个练习进行,其中实现了redu/2,它将删除给定列表的重复项并将新列表作为第二个参数:
redu([],[]).
redu([H|T], Result):-
member(H,T),
redu(T,Result).
redu([H|T], [H|Result]):-
redu(T, Result).
一条痕迹告诉我:
[trace] ?- redu([a,b,b,c,a], X).
Call: (8) redu([a, b, b, c, a], _35630) ? creep
Call: (9) lists:member(a, [b, b, c, a]) ? creep
Exit: (9) lists:member(a, [b, b, c, a]) ? creep
Call: (9) redu([b, b, c, a], _35630) ? creep
Call: (10) lists:member(b, [b, c, a]) ? creep
Exit: (10) lists:member(b, [b, c, a]) ? creep
Call: (10) redu([b, c, a], _35630) ? creep
Call: (11) lists:member(b, [c, a]) ? creep
Fail: (11) lists:member(b, [c, a]) ? creep
Redo: (10) redu([b, c, a], _35630) ? creep
Call: (11) redu([c, a], _35900) ? creep
Call: (12) lists:member(c, [a]) ? creep
Fail: (12) lists:member(c, [a]) ? creep
Redo: (11) redu([c, a], _35900) ? creep
Call: (12) redu([a], _35906) ? creep
Call: (13) lists:member(a, []) ? creep
Fail: (13) lists:member(a, []) ? creep
Redo: (12) redu([a], _35906) ? creep
Call: (13) redu([], _35912) ? creep
Exit: (13) redu([], []) ? creep
Exit: (12) redu([a], [a]) ? creep
Exit: (11) redu([c, a], [c, a]) ? creep
Exit: (10) redu([b, c, a], [b, c, a]) ? creep
Exit: (9) redu([b, b, c, a], [b, c, a]) ? creep
Exit: (8) redu([a, b, b, c, a], [b, c, a]) ? creep
X = [b, c, a]
如果有人能用自然语言向我解释递归的作用以及如何阅读子句,我将不胜感激。与第二个子句一样,它读作“从列表H|T 中删除重复项并输出Result 如果该列表的头部是尾部的成员并从尾部删除重复项并输出结果是否正确?但是这两个Results怎么会一样呢?而且我也不知道什么时候激活的规则。它什么时候在我的条款列表中前进?它什么时候回去?
抱歉所有问题。我真的很想了解一切。
【问题讨论】:
-
您的编辑从根本上改变了问题,并使答案无效。我们不应该在 SO 上这样做,所以我要回滚。