Sto tentando di scrivere un programma che richiede due elenchi come input e controlla il sottoinsieme appropriato. Ho iniziato con:Corretto sottoinsieme - Prolog
proper([A],[]).
proper([],[A]).
proper([A|T1],[A|T2]) :- proper(T1,T2).
Ciò funziona perfettamente per gli input nello stesso ordine. per esempio:
?- proper([a,b,c],[a,b,c,d]).
Yes
ma non per gli ingressi quali:
?- proper([a,b,c],[b,d,a,c]).
No
Dopo aver guardato attraverso il sito ho trovato questa domanda posta in precedenza:
Che mi portano per modificare il mio codice in quanto tale:
proper([A],[]).
proper([],[A]).
proper([A|T1],[A|T2) :- member(A,T2), proper(T1,T2).
proper([H1|T1], [H2|T2]) :- \+ member(H1, T2).
Funziona bene per sottoinsiemi ma non per sottoinsiemi appropriati. Credo che il mio problema derivi dalla mia comprensione di come funziona la seconda clausola di/4 appropriato. Qualsiasi aiuto è molto apprezzato.
Edit:
sono reso conto che stavo cercando di determinare se il primo elenco è stato un sottoinsieme proprio del secondo e il secondo è stato un sottoinsieme proprio del primo. Pulito il codice per essere più preciso.
proper([],_).
proper([A|T1],[A|T2) :- member(A,T2), proper(T1,T2).
proper([H1|T1], [H2|T2]) :- \+ member(H1, T2).
Basta ordinare le liste. Questa è la cosa più sensata da fare e anche la libreria standard. –
@Boris potresti indicarmi il predicato della libreria standard per i sottoinsiemi appropriati? –
@aBathologist Dai un'occhiata alla libreria (ordsets) (nell'implementazione SWI-Prolog, ad esempio) e alla sua fonte. Non esiste un predicato per il sottoinsieme "corretto", ma solo guardare le lunghezze dovrebbe essere abbastanza buono, come hai già indicato nella tua risposta. –