Qui va un'implementazione:
subset([], []).
subset([E|Tail], [E|NTail]):-
subset(Tail, NTail).
subset([_|Tail], NTail):-
subset(Tail, NTail).
Essa genererà tutti i sottoinsiemi, anche se non nell'ordine indicato sulla il tuo esempio.
Secondo la richiesta commentatore qui va una spiegazione:
La prima clausola è il caso base. Dichiara che la lista vuota è un sottoinsieme della lista vuota.
La seconda e la terza clausola riguardano la ricorsione. La seconda clausola afferma che se due liste hanno la stessa Testa e la coda della lista di destra è un sottoinsieme della coda della lista di sinistra, allora la lista di destra è un sottoinsieme della lista di sinistra.
La terza clausola afferma che se si salta la testa della lista di sinistra e la lista di destra è un sottoinsieme della coda della lista di sinistra, la lista di destra è un sottoinsieme della lista di sinistra.
La procedura sopra riportata genera set ordinati. Per i set non ordinati si potrebbe utilizzare permutation/3
:
unordered_subset(Set, SubSet):-
length(Set, LSet),
between(0,LSet, LSubSet),
length(NSubSet, LSubSet),
permutation(SubSet, NSubSet),
subset(Set, NSubSet).
Dovresti cambiare gli argomenti nel predicato sottoinsiemi (X, Y) in modo che leggiamo naturalmente X è un sottoinsieme di Y, non come hai fatto tu: Y è un sottoinsieme di X. –