【问题标题】:Select N elements from a List in Prolog从 Prolog 中的列表中选择 N 个元素
【发布时间】:2014-01-24 01:17:43
【问题描述】:

我正在尝试编写一个 Prolog 谓词 (SWI),它会从列表中选择 N 个元素,如下所示:

selectn(+N, ?Elems, ?List1, ?List2) 当 List1 为真,所有 Elems 被移除,结果为 List2

selectn(N,Lps,L1s,[]) :- length(L1s,L), N >= L, permutation(L1s,Lps).
selectn(0,[],L1s,Lps) :- permutation(L1s,Lps).
selectn(N,[E|Es],L1s,L2s) :- 
    select(E,L1s,L0s),
    N0 is N-1,
    selectn(N0,Es,L0s,L2s).

我的问题是,在某些情况下,我得到重复的结果,我不知道如何避免它们:

?- findall(L,selectn(2,Es,[a,b,c],L),Ls),length(Ls,Solutions).
Ls = [[c], [b], [c], [a], [b], [a]],
Solutions = 6.

这不是家庭作业,但如果你想像那样帮助我,我也会很高兴。

【问题讨论】:

    标签: prolog


    【解决方案1】:

    这可以回答你的问题(虽然我不明白你的第一个子句 selectn/4,排列已经由 'nested' select/3 完成)

    selectn(0, [], Rest, Rest).
    selectn(N, [A|B], C, Rest) :-
        append(H, [A|T], C),
        M is N-1,
        selectn(M, B, T, S),
        append(H, S, Rest).
    

    产量

    ?- findall(L,selectn(2,Es,[a,b,c],L),Ls),length(Ls,Solutions).
    Ls = [[c], [b], [a]],
    Solutions = 3.
    

    【讨论】:

    • 感谢您的回复@CapelliC!它确实对我有很大帮助。但是,使用您的代码,任何selectn/4 都不会按照您的建议进行排列,这在查询selectn(3,[c,a,b],[a,b,c,d],[d]).selectn(0,[a,b],[b,a]). 时会失败,这当然是因为重复项不被视为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多