I need to check if each element in second list has 3 times more instances then the same element in the first list. My function returns false all the time and I don’t know what I’m dong wrong.
Here is the code:
fourth(_,[ ]).
fourth(A,[HF|TF]) :-
intersection(A, HF, NewA),
intersection(TF, HF, NewB),
append(HF, NewB, NewT),
append(NewA, NewA, NewAA),
append(NewA, NewAA, NewAAA),
length(NewAAA) == length(NewT),
select(HF, TF, NewTF),
fourth(A, NewTF).
Example:
?- fourth([1,2,3], [1,1,1]).
true.
?- fourth([1,2,3], [1,1,1,1]).
false.
?- fourth([1,2,3], [1,1]).
false.
?- fourth([1,2,2,3], [1,1,2,2,1,2,2,2,2]).
true.
I would make myself a
select/3predicate:select(X,From,Left), and then for each elt of a first list I’d call it three times with same first argument on a second list, progressively passing it forward, getting me a finalLeft3without the three occurences ofX; iand I’d do that for each elt of a first list. Then if I’d succeed and end up with an empty list, that means it had exactly three times each elt from the first list.