clan( X, [X|R] ).
clan( X, [_|R] ) :- clan( X, R ).

nije_u_redu( L ) :- clan( vuk, L ), clan( koza, L ).
nije_u_redu( L ) :- clan( koza, L ), clan( kupus, L ).

u_redu( vkk( _, L, D ) ) :- not nije_u_redu( D ), not nije_u_redu(L).

prethodi( vuk, _ ).
prethodi( _, kupus ).

ubaci_na_mesto( X, [], [X] ).
ubaci_na_mesto( X, [Y|Ys], [X,Y|Ys] ):- prethodi( X, Y ).
ubaci_na_mesto( X, [Y|Ys], [Y|Zs] ):- ubaci( X, Ys, Zs ).

izaberi( X, [X|Xs], Xs ).
izaberi( X, [Y|Xs], [Y|Ys] ) :- izaberi( X, Xs, Ys ).

promena_na_obali( Teret, levo, L, D, L1, D1 ) :-
  izaberi( Teret, L, L1 ), ubaci_na_mesto( Teret, D, D1 ).
promena_na_obali( Teret, desno, L, D, L1, D1 ) :-
  izaberi( Teret, D, D1 ), ubaci_na_mesto( Teret, L, L1 ).
promena_na_obali( sam, C, L, D, L, D ).

promena_u_camcu( levo, desno ).
promena_u_camcu( desno, levo ).

promena( vkk( C, L, D ), Teret, vkk( C1, L1, D1 ) ) :-
  promena_u_camcu( C, C1 ),
  promena_na_obali( Teret, C, L, D, L1, D1 ).
  
pokret( vkk( levo, L, D ), Teret ) :- clan( Teret, L ).
pokret( vkk( desno, L, D ), Teret ) :- clan( Teret, D ).
pokret( vkk( C, L, D ) , sam ).

resi( vkk( desno, [], [vuk,koza,kupus] ), Istorija, [] ).
resi( Stanje, Istorija, [Kretanje|Kretanja] ) :-
  pokret( Stanje, Kretanje ),
  promena( Stanje, Kretanje, Stanje1 ), 
  u_redu( Stanje1 ), 
  not clan( Stanje1, Istorija ), 
  resi( Stanje1, [Stanje1|Istorija], Kretanja ).
  
test( Kretanja ) :- resi( vkk(levo, [vuk, koza, kupus], []), [vkk(levo, [vuk, koza, kupus], '[]')], Kretanja ).