作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码,这显然是显示 2 个列表之间并集的标准方法:
union([Head|Tail],List2,Result) :-
member(Head,List2), union(Tail,List2,Result).
union([Head|Tail],List2,[Head|Result]) :-
\+ member(Head,List2), union(Tail,List2,Result).
union([],List2,List2).
union([a,b,c,d,2,3], [b,c,3,99], Result).
Result = [a,d,2,b,c,3,99] ?
yes
最佳答案
让我们假设你问 union([1,2],[2],R)。
根据第一条规则, union([1|[2]],[2],R) 为真,如果
成员(1,[2]) --> 假
然后 prolog 将检查第二个规则 union([1|[2]],[2],[1|R]) 是否为真,如果
+member(1,[2]) --> 真
和联合([2],[2],R)
现在, union([2|[]],[2],R) 为真(第一条规则),如果
成员(2,[2]) --> 真
和联合([],[2],R)
union([],[2],R) 如果 R=[2] 为真(第三条规则)
所以 R=[2] 因此第一次调用 union 返回 [1|[2]] = [1,2]
找出“序言如何做”的有用工具是 trace/0:
2 ?- trace.
true.
[trace] 2 ?- union([1,2],[2],R).
Call: (6) union([1, 2], [2], _G543) ? creep
Call: (7) lists:member(1, [2]) ? creep
Fail: (7) lists:member(1, [2]) ? creep
Redo: (6) union([1, 2], [2], _G543) ? creep
Call: (7) lists:member(1, [2]) ? creep
Fail: (7) lists:member(1, [2]) ? creep
Call: (7) union([2], [2], _G619) ? creep
Call: (8) lists:member(2, [2]) ? creep
Exit: (8) lists:member(2, [2]) ? creep
Call: (8) union([], [2], _G619) ? creep
Exit: (8) union([], [2], [2]) ? creep
Exit: (7) union([2], [2], [2]) ? creep
Exit: (6) union([1, 2], [2], [1, 2]) ? creep
R = [1, 2] .
关于list - Prolog 如何将 2 个列表打印为一个列表,而无需任何附加代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8390610/
我是一名优秀的程序员,十分优秀!