solve :-
    StartingState = [1,3,3,0,0],
    depth_first_search([],StartingState,Solution),
    write(Solution),
    nl.
    
depth_first_search(CurrentPath,CurrentState,Solution) :-
    CurrentState=[-1,0,0,3,3],
    Solution=[CurrentState|CurrentPath].
    
depth_first_search(CurrentPath,CurrentState,Solution) :-
    successor(CurrentState,NewState),
    not(member(NewState,CurrentPath)),
    depth_first_search([CurrentState|CurrentPath],NewState,Solution).
    
successor([Side,LM,LC,RM,RC],[NewSide,NewLM,LC,NewRM,RC]) :-
    NewLM is LM-1*Side,
    NewRM is RM+1*Side,
    NewSide is (-1)*Side,
    test(NewLM,LC,NewRM,RC).
    
successor([Side,LM,LC,RM,RC],[NewSide,NewLM,LC,NewRM,RC]) :-
    NewLM is LM-2*Side,
    NewRM is RM+2*Side,
    NewSide is (-1)*Side,
    test(NewLM,LC,NewRM,RC).
    
successor([Side,LM,LC,RM,RC],[NewSide,LM,NewLC,RM,NewRC]) :-
    NewLC is LC-2*Side,
    NewRC is RC+2*Side,
    NewSide is (-1)*Side,
    test(LM,NewLC,RM,NewRC).

successor([Side,LM,LC,RM,RC],[NewSide,LM,NewLC,RM,NewRC]) :-
    NewLC is LC-1*Side,
    NewRC is RC+1*Side,
    NewSide is (-1)*Side,
    test(LM,NewLC,RM,NewRC).
    
successor([Side,LM,LC,RM,RC],[NewSide,NewLM,NewLC,NewRM,NewRC]) :-
    NewLC is LC-1*Side,
    NewRC is RC+1*Side,
    NewLM is LM-1*Side,
    NewRM
 is RM+1*Side,
    NewSide is (-1)*Side,
    test(NewLM,NewLC,NewRM,NewRC).
    
test(LeftMissionaries,LeftCannibals,RightMissionaries,RightCannibals) :-
    LeftMissionaries>=0,
    LeftCannibals>=0,
    RightMissionaries>=0,
    RightCannibals>=0,
    LeftMissionaries>=LeftCannibals,
    RightMissionaries>=RightCannibals.
    
test(LeftMissionaries,LeftCannibals,RightMissionaries,RightCannibals) :-
    LeftMissionaries>=0,
    LeftCannibals>=0,
    RightMissionaries>=0,
    RightCannibals>=0,
    LeftMissionaries>=LeftCannibals,
    RightMissionaries=0.
    
test(LeftMissionaries,LeftCannibals,RightMissionaries,RightCannibals) :-
    LeftMissionaries>=0,
    LeftCannibals>=0,
    RightMissionaries>=0,
    RightCannibals>=0,
    LeftMissionaries=0,
    RightMissionaries>=RightCannibals.