Prolog lise la différence
-
13-12-2019 - |
Question
J'essaie de faire un programme dans PRolog que va faire quelque chose comme ceci:
diffSet([a,b,c,d], [a,b,e,f], X).
X = [c,d,e,f]
J'ai écrit ceci:
diffSet([], _, []).
diffSet([H|T1],Set,Z):- member(Set, H), !, diffSet(T1,Set,Z).
diffSet([H|T], Set, [H|Set2]):- diffSet(T,Set,Set2).
Mais de cette façon je ne peux obtenir que des éléments de la première liste.Comment puis-je extraire les éléments du second?
@edit: Le membre vérifie si H est en jeu
member([H|_], H).
member([_|T], H):- member(T, H).
La solution
Il y a un intégré qui supprimer des éléments de la liste:
diffSet([], X, X).
diffSet([H|T1],Set,Z):-
member(H, Set), % NOTE: arguments swapped!
!, delete(T1, H, T2), % avoid duplicates in first list
delete(Set, H, Set2), % remove duplicates in second list
diffSet(T2, Set2, Z).
diffSet([H|T], Set, [H|Set2]) :-
diffSet(T,Set,Set2).
Autres conseils
ou en utilisant uniquement des constructions intégrées.Si vous vouliez juste faire le travail:
notcommon(L1, L2, Result) :-
intersection(L1, L2, Intersec),
append(L1, L2, AllItems),
subtract(AllItems, Intersec, Result).
?- notcommon([a,b,c,d], [a,b,e,f], X).
X = [c, d, e, f].
Éviter délibérément les constructions pour cela que @CHAC mentionne, c'est une manière inélégante qui fait le travail.
notcommon([], _, []).
notcommon([H1|T1], L2, [H1|Diffs]) :-
not(member(H1, L2)),
notcommon(T1, L2, Diffs).
notcommon([_|T1], L2, Diffs) :-
notcommon(T1, L2, Diffs).
alldiffs(L1, L2, AllDiffs) :-
notcommon(L1, L2, SetOne),
notcommon(L2, L1, SetTwo),
append(SetOne, SetTwo, AllDiffs).
? alldiffs([a,b,c,d], [a,b,e,f], X).
X = [c, d, e, f] .
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow