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 = [] ? ;
它并没有通过定义的谓词来完成所有可能的解决方案。我期望输出如上所示,包含将两个列表组合在一起的所有解决方案有帮助吗?
您的谓词缺少某些子句。第一条说如果第一个列表用完了,那么结果就是第二个列表。
第二个子句指定,如果第一个列表没有用尽,我们只是将列表的第一个元素作为结果。因此,这意味着您基本上实现了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).