定义一个谓词解决方案/ 3,当它的三个参数(所有列表)具有包含前两个参数的所有元素的第三列表时为真

问题描述 投票:1回答:1
solution([ ], List, List).
solution([Head|Tail], List,[Head|Result]):-  
solution(Tail, List,Result). 

期望的输出

| ?- Solution(X,Y,[a,b,c]).

X = [a,b,c]
Y = [] ? ;

X = [a,b]
Y = [c] ? ;

X = [a,c]
Y = [b] ? ;

X = [a]
Y = [b,c] ? ;

X = [b,c]
Y = [a] ? ;

X = [b]
Y = [a,c] ? ;

X = [c]
Y = [a,b] ? ;

X = []
Y = [a,b,c] ? ;

实际输出

X = []Y = [a,b,c]? ;

X = [a]
Y = [b,c] ? ;

X = [a,b]
Y = [c] ? ;

X = [a,b,c]
Y = [] ? ;

它并没有通过定义的谓词来完成所有可能的解决方案。我期望输出如上所示,包含将两个列表组合在一起的所有解决方案有帮助吗?

prolog predicate
1个回答
0
投票

您的谓词缺少某些子句。第一条说如果第一个列表用完了,那么结果就是第二个列表。

第二个子句指定,如果第一个列表没有用尽,我们只是将列表的第一个元素作为结果。因此,这意味着您基本上实现了append/3 predicate [swi-doc]

但是,根据您的示例输出,可以决定是从第一个列表中获取还是从第二个列表中获取。因此,我们应该实现如下子句:

append/3

如果两个列表都用尽,我们可以返回一个空列表,因此我们可以定义一个基本子句,如:

solution([H1|T1], L2, [H1|R]) :-
    solution(T1, L2, R).
solution(L1, [H1|T2], [H1|R]) :-
    solution(L1, T2, R).

因此获得完整的解决方案:

solution([], [], []).

然后这给了我们:

solution([], [], []).
solution([H1|T1], L2, [H1|R]) :-
    solution(T1, L2, R).
solution(L1, [H1|T2], [H1|R]) :-
    solution(L1, T2, R).
© www.soinside.com 2019 - 2024. All rights reserved.