Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I hope I don't misunderstand the problem... Here a solution in SWI-Prolog</p> <pre><code>:- module(subsets, [solve/0]). :- [library(pairs), library(aggregate)]. solve :- problem(R, K, Subsets), once(subset_of_maximal_number(R, K, Subsets, Subset)), writeln(Subset). problem(4, 2, [[1,2,3], [1,2,3], [1,2,4], [1,3,4]]). problem(8, 3, [[1, 3, 4, 6], [2, 6, 7, 8], [3, 5, 6, 7], [2, 4, 6, 7], [1, 4, 5, 8], [2, 4, 6, 8], [1, 2, 3, 8], [1, 6, 7, 8], [1, 2, 4, 7], [1, 2, 5, 7]]). subset_of_maximal_number(R, K, Subsets, Subset) :- flatten(Subsets, Numbers), findall(Num-Count, ( between(1, R, Num), aggregate_all(count, member(Num, Numbers), Count) ), NumToCount), transpose_pairs(NumToCount, CountToNumSortedR), reverse(CountToNumSortedR, CountToNumSorted), length(Subset, K), % list of free vars prefix(SolutionsK, CountToNumSorted), pairs_values(SolutionsK, Subset). </code></pre> <p>test output:</p> <pre><code>?- solve. [1,3] true ; [7,6,2] true. </code></pre> <p><strong>edit:</strong> I think that the above solution is wrong, in the sense that what's returned could not be a subset of any of the input: here (a commented) solution without this problem:</p> <pre><code>:- module(subsets, [solve/0]). :- [library(pairs), library(aggregate), library(ordsets)]. solve :- problem(R, K, Subsets), once(subset_of_maximal_number(R, K, Subsets, Subset)), writeln(Subset). problem(4, 2, [[1,2,3], [1,2,3], [1,2,4], [1,3,4]]). problem(8, 3, [[1, 3, 4, 6], [2, 6, 7, 8], [3, 5, 6, 7], [2, 4, 6, 7], [1, 4, 5, 8], [2, 4, 6, 8], [1, 2, 3, 8], [1, 6, 7, 8], [1, 2, 4, 7], [1, 2, 5, 7]]). subset_of_maximal_number(R, K, Subsets, Subset) :- flatten(Subsets, Numbers), findall(Num-Count, ( between(1, R, Num), aggregate_all(count, member(Num, Numbers), Count) ), NumToCount), % actually sort by ascending # of occurrences transpose_pairs(NumToCount, CountToNumSorted), pairs_values(CountToNumSorted, PreferredRev), % we need higher values first reverse(PreferredRev, Preferred), % empty slots to fill, preferred first length(SubsetP, K), select_k(Preferred, SubsetP), % verify our selection it's an actual subset of any of subsets sort(SubsetP, Subset), once((member(S, Subsets), ord_subtract(Subset, S, []))). select_k(_Subset, []). select_k(Subset, [E|R]) :- select(E, Subset, WithoutE), select_k(WithoutE, R). </code></pre> <p>test:</p> <pre><code>?- solve. [1,3] true ; [2,6,7] true. </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload