Скачиваний:
9
Добавлен:
01.05.2014
Размер:
7.55 Кб
Скачать
%-------------------------------------------------------MAIN PROCEDURE--------------------------------------------------------------

solution([],_).
solution([Head|Tail],Reefs):-solution(Tail,Reefs),solution_select(Head,Reefs,Tail).
%------------------------------------------------SELECT SOLUTION OF EACH STEP-------------------------------------------------------

solution_select([X/Y/N/Orient|Others],Reefs,Tail):-(N=:=1,solution_1([X/Y/N/Orient|Others],Reefs,Tail));
(N=:=2,solution_2([X/Y/N/Orient|Others],Reefs,Tail));
(N=:=3,solution_3([X/Y/N/Orient|Others],Reefs,Tail));
(N=:=4,solution_4([X/Y/N/Orient|Others],Reefs)).

%---------------------------------------------------CHOOSE THE POSITIONS OF 4 SHIPS 1X1--------------------------------------------

solution_1([X1/Y1/N1/O1,X2/Y2/N2/O2,X3/Y3/N3/O3,X4/Y4/N4/O4],Reefs,Tail):-memberItem(X1/Y1/N1/O1,0,0),A1 is X1+O1*(N1-1),B1 is Y1+(1-O1)*(N1-1),
noattackItem_1n(X1/Y1/A1/B1,Tail),noattackReef_1n(X1/Y1/A1/B1,Reefs),

memberItem(X2/Y2/N2/O2,X1,Y1),A2 is X2+O2*(N2-1),B2 is Y2+(1-O2)*(N2-1),
noattackItem_1n(X2/Y2/A2/B2,Tail),noattackReef_1n(X2/Y2/A2/B2,Reefs),

memberItem(X3/Y3/N3/O3,X2,Y2),A3 is X3+O3*(N3-1),B3 is Y3+(1-O3)*(N3-1),
noattackItem_1n(X3/Y3/A3/B3,Tail),noattackReef_1n(X3/Y3/A3/B3,Reefs),

memberItem(X4/Y4/N4/O4,X3,Y3),A4 is X4+O4*(N4-1),B4 is Y4+(1-O4)*(N4-1),
noattackItem_1n(X4/Y4/A4/B4,Tail),noattackReef_1n(X4/Y4/A4/B4,Reefs).

%---------------------------------------------------CHOOSE THE POSITIONS OF 3 SHIPS 1X2---------------------------------------------

solution_2([X1/Y1/N1/O1,X2/Y2/N2/O2,X3/Y3/N3/O3],Reefs,Tail):-memberItem(X1/Y1/N1/O1,0,0),A1 is X1+O1*(N1-1),B1 is Y1+(1-O1)*(N1-1),
noattackItem_1n(X1/Y1/A1/B1,Tail),noattackReef_1n(X1/Y1/A1/B1,Reefs),

memberItem(X2/Y2/N2/O2,X1,Y1),A2 is X2+O2*(N2-1),B2 is Y2+(1-O2)*(N2-1),
conc([X1/Y1/N1/O1],Tail,Tail1),
noattackItem_1n(X2/Y2/A2/B2,Tail1),noattackReef_1n(X2/Y2/A2/B2,Reefs),

memberItem(X3/Y3/N3/O3,X2,Y2),A3 is X3+O3*(N3-1),B3 is Y3+(1-O3)*(N3-1),
conc([X2/Y2/N2/O2],Tail1,Tail2),
noattackItem_1n(X3/Y3/A3/B3,Tail2),noattackReef_1n(X3/Y3/A3/B3,Reefs).

%---------------------------------------------------CHOOSE THE POSITIONS OF 2 SHIPS 1X3---------------------------------------------

solution_3([X1/Y1/N1/O1,X2/Y2/N2/O2],Reefs,Tail):-memberItem(X1/Y1/N1/O1,0,0),A1 is X1+O1*(N1-1),B1 is Y1+(1-O1)*(N1-1),
noattackItem_1n(X1/Y1/A1/B1,Tail),noattackReef_1n(X1/Y1/A1/B1,Reefs),

memberItem(X2/Y2/N2/O2,X1,Y1),A2 is X2+O2*(N2-1),B2 is Y2+(1-O2)*(N2-1),
conc([X1/Y1/N1/O1],Tail,Tail1),noattackItem_1n(X2/Y2/A2/B2,Tail1),noattackReef_1n(X2/Y2/A2/B2,Reefs).

%---------------------------------------------------CHOOSE THE POSITION OF 1 SHIP 1X4----------------------------------------------

solution_4([X1/Y1/N1/O1],Reefs):-memberItem(X1/Y1/N1/O1,0,0),A1 is X1+O1*(N1-1),B1 is Y1+(1-O1)*(N1-1),noattackReef_1n(X1/Y1/A1/B1,Reefs).

%---------------------------------------------------INITIATE THE POSITION OF 1 SHIP-------------------------------------------------

memberItem(X/Y/N/O,MinX,MinY):-member(X,[0,1,2,3,4,5,6,7,8,9]),X>=MinX,member(Y,[0,1,2,3,4,5,6,7,8,9]),member(O,[0,1]),X*10+Y>MinX*10+MinY,
A is X+O*(N-1),member(A,[0,1,2,3,4,5,6,7,8,9]),
B is Y+(1-O)*(N-1),member(B,[0,1,2,3,4,5,6,7,8,9]).

%------------------------------------------------PREVENT THE SHIPS FROM DRIVING INTO REEFS------------------------------------------

noattackReef_1n(_,[]).
noattackReef_1n(X/Y/A/B,[Xx/Yy|Rest]):-noattackReef_11(X/Y/A/B,Xx/Yy),noattackReef_1n(X/Y/A/B,Rest).

noattackReef_11(X/Y/A/B,Xx/Yy):-Xx=\=X,Xx=\=A,Yy=\=Y,Yy=\=B,!.
%noattackReef_11(X/Y/A/B,Xx/Yy):-X>Xx,A>Xx,!.
%noattackReef_11(X/Y/A/B,Xx/Yy):-X<Xx,A<Xx,!.
%noattackReef_11(X/Y/A/B,Xx/Yy):-Y>Yy,B>Yy,!.
%noattackReef_11(X/Y/A/B,Xx/Yy):-Y<Yy,B<Yy,!.


noattackReef_11(X/Y/A/B,Xx/Yy):-X>Xx+1,A>Xx+1,!.
noattackReef_11(X/Y/A/B,Xx/Yy):-X<Xx-1,A<Xx-1,!.
noattackReef_11(X/Y/A/B,Xx/Yy):-Y>Yy+1,B>Yy+1,!.
noattackReef_11(X/Y/A/B,Xx/Yy):-Y<Yy-1,B<Yy-1,!.

%--------------------------------------------------PREVENT THE SHIPS FROM DRIVING INTO TOGETHER-------------------------------------

noattackItem_1n(_,[]).
noattackItem_1n(X/Y/A/B,[List|Rest]):-noattackItem1_1n(X/Y/A/B,List),noattackItem_1n(X/Y/A/B,Rest),!.
noattackItem_1n(X/Y/A/B,[Xx/Yy/Nn/Oo|Rest]):-noattackItem1_1n(X/Y/A/B,[Xx/Yy/Nn/Oo]),noattackItem_1n(X/Y/A/B,Rest).

noattackItem1_1n(_,[]).
noattackItem1_1n(X/Y/A/B,[Xx/Yy/Nn/Oo|Rest]):-Aa is Xx+Oo*(Nn-1),Bb is Yy+(1-Oo)*(Nn-1),
noattackItem_11(X/Y/A/B,Xx/Yy/Aa/Bb),noattackItem_1n(X/Y/A/B,Rest).

%noattackItem_11(X/Y/A/B,_):-X>A,!.
%noattackItem_11(X/Y/A/B,_):-Y>B,!.
%noattackItem_11(X/Y/A/B,Xx/Yy/Aa/Bb):-X=:=A,X1 is X,Y1 is Y+1,
%noattackReef_11(Xx/Yy/Aa/Bb,X/Y),noattackItem_11(X1/Y1/A/B,Xx/Yy/Aa/Bb),!.
%noattackItem_11(X/Y/A/B,Xx/Yy/Aa/Bb):-Y=:=B,X1 is X+1,Y1 is Y,
%noattackReef_11(Xx/Yy/Aa/Bb,X/Y),noattackItem_11(X1/Y1/A/B,Xx/Yy/Aa/Bb),!.


noattackItem_11(X/Y/A/B,_):- X>A,!.
noattackItem_11(X/Y/A/B,_):- Y>B,!.
noattackItem_11(X/Y/A/B,Xx/Yy/Aa/Bb):- X=:=A,X1 is X,Y1 is Y+1, noattackReef_11(Xx/Yy/Aa/Bb,X/Y),noattackItem_11(X1/Y1/A/B,Xx/Yy/Aa/Bb),!. noattackItem_11(X/Y/A/B,Xx/Yy/Aa/Bb):- Y=:=B,X1 is X+1,Y1 is Y, noattackReef_11(Xx/Yy/Aa/Bb,X/Y),noattackItem_11(X1/Y1/A/B,Xx/Yy/Aa/Bb),!.





conc([],L,L).
conc([X|L1],L2,[X|L3]):-conc(L1,L2,L3).

%--------------------------------------------------STRUCTURED DATA OF SHIPS---------------------------------------------------------

ships([[X1/Y1/1/0,X2/Y2/1/0,X3/Y3/1/0,X4/Y4/1/0],
[X5/Y5/2/Orient5,X6/Y6/2/Orient6,X7/Y7/2/Orient7],
[X8/Y8/3/Orient8,X9/Y9/3/Orient9],
[X10/Y10/4/Orient10]]).
Соседние файлы в папке Морской бой в Прологе