palate 0.3.7

File type detection combining tft and hyperpolyglot
Documentation
/**
 * Question 1.1
 * combiner(+Buddies, -Pairs)
 */
combiner([], []).
combiner([First|Buddies], Pairs):-
	make_pairs(First, Buddies, Pairs1),
	combiner(Buddies, Pairs2),
	concat(Pairs1, Pairs2, Pairs).

/**
 * make_pairs(+Buddy, +Buddies, -Pairs)
 */
make_pairs(Buddy, [], []).
make_pairs(Buddy, [First|Buddies], [(Buddy, First)|Pairs]):-
	make_pairs(Buddy, Buddies, Pairs).

/**
 * concat(+X, +Y, ?T)
 */
concat([], Y, Y).
concat([P|R], Y, [P|T]):-
	concat(R, Y, T).


/**
 * Question 1.2
 * extraire(+AllPossiblePairs, +NbPairs, -Tp, -RemainingPairs)
 */
extraire(AllPossiblePairs, 0, [], AllPossiblePairs).
extraire([PossiblePair|AllPossiblePairs], NbPairs, [PossiblePair|Tp], NewRemainingPairs):-
	NbPairs > 0,
	NewNbPairs is NbPairs - 1,
	extraire(AllPossiblePairs, NewNbPairs, Tp, RemainingPairs),
	not(pair_in_array(PossiblePair, Tp)),
	delete_pair(RemainingPairs, PossiblePair, NewRemainingPairs).
extraire([PossiblePair|AllPossiblePairs], NbPairs, Tp, [PossiblePair|RemainingPairs]):-
	NbPairs > 0,
	extraire(AllPossiblePairs, NbPairs, Tp, RemainingPairs),
	pair_in_array(PossiblePair, Tp).

/**
 * delete_pair(+Pairs, +Pair, -PairsWithoutPair)
 */
delete_pair([], _, []).
delete_pair([Pair|Pairs], Pair, Pairs):-!.
delete_pair([FirstPair|Pairs], Pair, [FirstPair|PairsWithoutPair]):-
	delete_pair(Pairs, Pair, PairsWithoutPair).

/**
 * pair_in_array(+Pair, +Pairs)
 */
pair_in_array((A, B), [(C, D)|Pairs]):-
	(A == C ; B == D ; A == D ; B == C),
	!.
pair_in_array(Pair, [FirstPair|Pairs]):-
	pair_in_array(Pair, Pairs).


/**
 * Question 1.3
 * les_tps(+Buddies, -Tps)
 */
les_tps(Buddies, Tps):-
	combiner(Buddies, PossiblePairs),
	length(Buddies, NbBuddies),
	NbPairs is integer(NbBuddies / 2),
	findall(Tp, extraire(PossiblePairs, NbPairs, Tp, _), Tps).