/** Hay.pl Checks that all the hay has turned yellow by checking that hay that has not changed has now changed. hay([[0,[[n,g,n],[g,y,g],[n,g,n]]],[1,[[n,y,n],[y,y,g],[n,g,n]]],[2,[[n,y,n],[y,y,y],[n,y,n]]],[3,[[n,y,n],[y,y,y],[n,y,n]]]],Frame). Frame=2 %% Frame when all the hay is yellow ?- hay([[0,[[n,g,n],[g,y,g],[n,g,n]]],[1,[[n,y,n],[y,y,g],[n,g,n]]],[2,[[n,y,n],[y,y,y],[n,g,n]]],[3,[[n,y,n],[y,y,y],[n,g,n]]]],Frame). Frame = epsilon ; **/ hay(Movie,FrameNumber) :- findgrasspositions1(Movie,Positions1,Count1), findhaytime(Movie,Positions1,_Positions2,Count1,_Count2,'epsilon',FrameNumber). findgrasspositions1(Movie,Positions,Count) :- Movie = [Frame | _Frames], Frame = [_FrameNumber, Stacks], findgrasspositions2(Stacks, [], Positions, 0, Count). findgrasspositions2([], Positions, Positions, Count, Count). findgrasspositions2(Stacks, Positions1, Positions2, Count1, Count2) :- Stacks = [Row | Rows], findgrasspositions3(Row, [], Positions3, Count1, Count3), append(Positions1, [Positions3], Positions4), findgrasspositions2(Rows, Positions4, Positions2, Count3, Count2). findgrasspositions3([], Positions, Positions, Count, Count). findgrasspositions3(Row, Positions1, Positions2, Count1, Count2) :- Row = [Stack | Stacks], countgreen(Stack, Count1, Count3, Symbol), append(Positions1, [Symbol], Positions3), findgrasspositions3(Stacks, Positions3, Positions2, Count3, Count2). countgreen('g', Count1, Count2, '*') :- Count2 is Count1 + 1, !. countgreen(_Stack, Count, Count, ''). findhaytime([],Positions,Positions,Count,Count,FrameNumber,FrameNumber). findhaytime(Movie,Positions1,Positions2,Count1,Count2,FrameNumber1,FrameNumber2) :- Movie = [Frame | Frames], Frame = [FrameNumber3, Stacks], transform1(Stacks,Positions1,[],Positions3,Count1,Count3), checkallhay(Frames,Positions3,Positions2,Count3,Count2,FrameNumber1,FrameNumber2,FrameNumber3). transform1([],[],Positions,Positions,Count,Count). transform1(Stacks,Positions1,Positions2,Positions3,Count1,Count2) :- Stacks = [Row1 | Rows1], Positions1 = [Row2 | Rows2], transform2(Row1, Row2,[],Positions4,Count1,Count3), append(Positions2,[Positions4],Positions5), transform1(Rows1, Rows2, Positions5, Positions3,Count3,Count2). transform2([],[],Positions,Positions,Count,Count). transform2(Row1,Row2,Positions1,Positions2,Count1,Count2) :- Row1 = [Stack1 | Stacks1], Row2 = [Stack2 | Stacks2], compare(Stack1, Stack2, Positions1, Positions3, Count1, Count3), transform2(Stacks1, Stacks2, Positions3, Positions2, Count3,Count2). compare('y','*', Positions1,Positions2,Count1, Count2) :- append(Positions1, [''],Positions2), Count2 is Count1 - 1, !. compare(_Stack1,Stack2, Positions1,Positions2,Count, Count) :- append(Positions1,[Stack2],Positions2). checkallhay(_Frames,_Positions1,_Positions2,0,_Count2,_FrameNumber1,FrameNumber2,FrameNumber2) :- !. checkallhay(Frames,Positions1,Positions2,Count1,Count2,FrameNumber1,FrameNumber2,_FrameNumber3) :- findhaytime(Frames,Positions1,Positions2,Count1,Count2,FrameNumber1,FrameNumber2).