fac(0,1).
fac(N,K):- N1 is N-1, fac(N1,K1), K is K1 * N.


app([],Y,Y).
app([Hx|Tx],Y,[Hx|T]) :- app(Tx,Y,T).









tailof([_|X],X).







has3ormore([_,_,_|_]).










barbaz([X,_,_,_,_,X|_]).











isin(X,[X|_]).
isin(X,[_|T]) :- isin(X,T).









len([],0).
len([_|T],N) :- len(T,Nt), N is Nt + 1.











rev(X,Y) :- acc_rev(X,Y,[]).
acc_rev([],Y,Y).  
acc_rev([H|T],Y,SoFar) :- acc_rev(T,Y,[H|SoFar]).






foo(a).  
foo(b). 
foo(c).
foo(d).





allfoos(L) :- listallfoos(L,[]).





listallfoos([X|L],SoFar) :- 
	foo(X),    
        not(isin(X,SoFar)),
        append(SoFar,[X],NewSoFar),
        listallfoos(L,NewSoFar).
     
listallfoos([],_).    








