gpt4 book ai didi

list - Prolog 如何将 2 个列表打印为一个列表,而无需任何附加代码?

转载 作者:行者123 更新时间:2023-12-04 06:05:46 25 4
gpt4 key购买 nike

我有以下代码,这显然是显示 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

我的问题是,prolog 如何做到这一点? List2 永远不会通过递归调用而改变,但最后,它会打印出在 2 个原始列表之间进行联合的所有元素。

请帮助我理解这段代码。

谢谢。

最佳答案

让我们假设你问 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] .

总而言之:List2 不会改变,但谓词也不会返回 List2;它返回由 List2 创建的列表和 List1 的唯一元素

关于list - Prolog 如何将 2 个列表打印为一个列表,而无需任何附加代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8390610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com