Hmm, chodzi o to że jeśli którakolwiek z tych zagnieżdżonych list zawiera 'e' to predykat działa
?
Wersja ogólniejsza niż potrzebujesz (sprawdza bardziej drzewo niż tylko listę trójelementowych list
- btw. bardziej by krotki pasowały jeśli zawsze mają być trzy elementy):
contains1(Elem, Elem).
contains1([Head | _], Elem) :- contains1(Head, Elem), !.
contains1([_ | Rest], Elem) :- contains1(Rest, Elem).
Jeśli nie podoba ci się ta ogólność, można to napisać tak (zadziała wtedy tylko dla tych trzyelementowych list) - zamienić dwie pierwsze linie na:
contains1([[A, B, C] | _], Elem) :- member(Elem, [A, B, C]), !.
Unit testy:
:- begin_tests(contains).
% dla wersji podstawowej
test(contains1) :- contains1([[a, b, c]], b).
test(contains1) :- contains1([[a, b, c], [d, e, f]], e).
test(contains1) :- \+ contains1([[a, b, c], [d, e, f]], z).
% wersja rozszerzona:
test(contains1) :- contains1(e, e).
test(contains1) :- contains1([a, b, c, d, e], e).
test(contains1) :- contains1([[a, b, c, d, e]], e).
test(contains1) :- contains1([[a, [b, c], d], e], c).
:- end_tests(contains).