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


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 = [] ? ;

它不会通过可以从定义的谓词得出的所有可能的解决方案。 我希望输出如上所示,包含将 2 个列表组合在一起的所有解决方案 有什么帮助吗?

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

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

但是,根据您的示例输出,可以决定是从第一个列表还是第二个列表获取。因此,我们应该实现这样的条款:

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).

然后,这给了我们:

?- 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].

最新更新