【问题标题】:define a predicate solution/3 which is true when its three arguments, all lists, has the third list containing all elements of the first two arguments定义一个谓词 solution/3 当它的三个参数(所有列表)具有包含前两个参数的所有元素的第三个列表时为真
【发布时间】:2019-12-29 13:43:23
【问题描述】:
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 个列表组合在一起的所有解决方案 有什么帮助吗?

【问题讨论】:

  • 为什么x = [c, b, a], Y = [] 不是解决方案?

标签: prolog predicate


【解决方案1】:

您的谓词缺少一些子句。第一个子句表示如果第一个列表用尽,则结果是第二个列表。

第二个子句指定如果第一个列表没有用完,我们只需将该列表的第一个元素作为结果。因此,这意味着您基本上实现了append/3 predicate [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].

【讨论】:

    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    相关资源
    最近更新 更多