Морской бой в Прологе / пролог
.docМинистерство образования Российской Федерации
Санкт-Петербургский Государственный Электротехнический Университет «ЛЭТИ»
Кафедра МО ЭВМ
Отчет по лабораторной работе
По дисциплине:
«Функциональное и логическое программирование»
Санкт-Петербург
2007
-
Морской бой.
Дан квадрат 10х10 и корабли (14 шт, 23 шт,32 шт, 41 шт). В качестве исходных данных рифы на карте. Необходимо так разместить корабли, чтобы они не попадали на рифы.
-
При выполнении работы исходные данные читаются из файла, в данной лабораторной работе ИД – рифы на карте, которые изначально известны.
0 1 2 3 4 5 6 7 8 9
-
р
р
р
р
р
р
р
р
р
р
р
р
р
р
р
р
р
р
р
р
Листинг программы разбивается на несколько секций
-
MAIN PROCEDURE
-
SELECT SOLUTION OF EACH STEP
-
CHOOSE THE POSITIONS OF 4 SHIPS 1X1
-
CHOOSE THE POSITIONS OF 3 SHIPS 1X2
-
CHOOSE THE POSITIONS OF 2 SHIPS 1X3
-
CHOOSE THE POSITION OF 1 SHIP 1X4
-
INITIATE THE POSITION OF 1 SHIP
-
PREVENT THE SHIPS FROM DRIVING INTO REEFS
-
PREVENT THE SHIPS FROM DRIVING INTO TOGETHER
-
STRUCTURED DATA OF SHIPS
В секции 1 рекурсивно вычисляется функция solution, которая ссылается на функцию solution_select.
Solution_select в свою очередь ссылается на solution_1, solution_2, solution_3, solution_4, которые выбирают позиции для кораблей 1х1, 1х2, 1х3, 1х4 соответственно. Функция solution состоит из 2 частей. Первая часть представлена списком кораблей Xi/Yi/k/orient, которые функция solution берет из ships(S). Xi и Yi – координаты первой клетки корабля, k – количество клеток, из которых состоит корабль(1,2,3 или 4), orient – ориентация корабля(1-горизонтальная, 0-вертикальная). Теперь рассмотрим раздел 2 и на его примере будет показано как происходит расстановка кораблей на карте. Рассмотрим функцию solution_1, X1/Y1/N1/O1 – координаты корабля/количество клеток/ориентация. Ai и Bi координаты противолежащей клетки. Вычисляются они следующим образом: Ai:=x+ориентация_корабля*(количество_клеток-1), Bi:=y+(1-ориентация_корабля)*(количество_клеток-1). Таким образом корабль располагается либо вертикально либо горизонтально на карте. Инициация на карте происходит в функции memberItem, таким образом, чтобы каждый следующий корабль располагался либо на карте либо правее, либо правее и ниже первой клетки предыдущего корабля (X*10+Y>MinX*10+MinY). Корабль не должен располагаться на клетках, занятых рифами или другими кораблями. Соответственно в функциях noattackItem_1n и noattackReef_1n проверяется данное условие. В функции noattackItem_1n корабль разбивается на составляющие его части - клетки.
Все корабли представлены в виде списка, необходимое условие выполнения функции – клетка должна находится на свободном участке. Для этого из списка берется корабль и его координаты. Если проверяемый корабль расположен горизонтально, то его клетки имеют одинаковый параметр Y, тогда мы к Х прибавляем 1, если корабль расположен вертикально, то его клетки имеют одинаковый параметр X, мы на каждом шаге от Y отнимаем 1, таким образом каждую клетку корабля сравниваем с координатами уже расположенных на карте кораблей. Функция noattackItem_1n ссылается на noattackReef_1n, где происходит проверка отличия координат клетки корабля и рифа(либо координат клетки существующего корабля).
-
Исходный текст программы:
%-------------------------------------------------------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]]).
-
Компиляция программы, формат исходных данных.
Ид находятся в файле input.txt, и содержат следующую информацию:
[0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0].
Данные представляют собой координаты рифов на карте, должны располагаться в квадратных скобках, в конце д.б. точка и перевод каретки.
Компиляция:
GNU Prolog 1.2.16
By Daniel Diaz
Copyright (C) 1999-2002 Daniel Diaz
| ?- consult(lab1).
compiling C:\GNU-Prolog\bin\lab1.pl for byte code...
C:\GNU-Prolog\bin\lab1.pl:64 warning: singleton variables [Y,B,Yy] for noattackReef_11/2
C:\GNU-Prolog\bin\lab1.pl:65 warning: singleton variables [Y,B,Yy] for noattackReef_11/2
C:\GNU-Prolog\bin\lab1.pl:66 warning: singleton variables [X,A,Xx] for noattackReef_11/2
C:\GNU-Prolog\bin\lab1.pl:67 warning: singleton variables [X,A,Xx] for noattackReef_11/2
C:\GNU-Prolog\bin\lab1.pl:79 warning: singleton variables [Y,B] for noattackItem_11/2
C:\GNU-Prolog\bin\lab1.pl:80 warning: singleton variables [X,A] for noattackItem_11/2
C:\GNU-Prolog\bin\lab1.pl:91--94 warning: singleton variables [X1,Y1,X2,Y2,X3,Y3,X4,Y4,X5,Y5,Orient5,X6,Y6,Orient6,X7,Y7,Orient7,X8,Y8,Orient8,X9,Y9,Orient9,X10,Y10,Orient10] for ships/1
C:\GNU-Prolog\bin\lab1.pl compiled, 94 lines read - 45718 bytes written, 62 ms
(15 ms) yes
Чтение исходных данных:
| ?- see('input.txt').
Yes
Выполнение программы:
0 1 2 3 4 5 6 7 8 9
-
р
р
р
р
р
р
р
р
р
р
р
р
р
р
р
р
р
р
р
р
| ?- read(Reefs),ships(S),solution(S,Reefs).
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,2/3/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,2/4/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,2/5/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,2/6/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,2/8/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,2/9/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,3/1/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,3/2/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,3/4/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,3/5/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,3/7/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,3/8/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,3/9/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,4/0/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,4/1/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,4/2/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,4/3/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,4/6/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,4/7/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ? ;
Reefs = [0/0,1/1,2/2,3/3,4/4,5/5,6/6,7/7,8/8,9/9,0/9,1/8,2/7,3/6,4/5,5/4,6/3,7/2,8/1,9/0]
S = [[0/8/1/0,1/9/1/0,2/1/1/0,4/8/1/0],[1/2/2/0,1/4/2/0,1/6/2/0],[0/5/3/0,1/0/3/1],[0/1/4/0]] ?
(47 ms) yes
Другой вариант исходных данных:
0 1 2 3 4 5 6 7 8 9
-
p
р
p
p
p
p
p
p
p
p
p
p
p
p
p
p
p
p
р
p
GNU Prolog 1.2.16
By Daniel Diaz
Copyright (C) 1999-2002 Daniel Diaz
| ?- consult(lab1).
compiling C:\GNU-Prolog\bin\lab1.pl for byte code...
C:\GNU-Prolog\bin\lab1.pl:64 warning: singleton variables [Y,B,Yy] for noattackReef_11/2
C:\GNU-Prolog\bin\lab1.pl:65 warning: singleton variables [Y,B,Yy] for noattackReef_11/2
C:\GNU-Prolog\bin\lab1.pl:66 warning: singleton variables [X,A,Xx] for noattackReef_11/2
C:\GNU-Prolog\bin\lab1.pl:67 warning: singleton variables [X,A,Xx] for noattackReef_11/2
C:\GNU-Prolog\bin\lab1.pl:79 warning: singleton variables [Y,B] for noattackItem_11/2
C:\GNU-Prolog\bin\lab1.pl:80 warning: singleton variables [X,A] for noattackItem_11/2
C:\GNU-Prolog\bin\lab1.pl:91--94 warning: singleton variables [X1,Y1,X2,Y2,X3,Y3,X4,Y4,X5,Y5,Orient5,X6,Y6,Orient6,X7,Y7,Orient7,X8,Y8,Orient8,X9,Y9,Orient9,X10,Y10,Orient10] for ships/1
C:\GNU-Prolog\bin\lab1.pl compiled, 94 lines read - 45718 bytes written, 156 ms
yes
| ?- see('input1.txt').
yes
| ?- read(Reefs),ships(S),solution(S,Reefs).
Reefs = [4/0,4/1,5/0,5/1,4/8,4/9,5/8,5/9,4/4,4/5,5/4,5/5,0/4,1/4,0/5,1/5,8/4,8/5,9/4,9/5]
S = [[1/6/1/0,1/7/1/0,1/8/1/0,1/9/1/0],[0/6/2/0,0/8/2/0,1/0/2/1],[0/2/3/1,0/3/3/1],[0/1/4/1]] ? ;
Reefs = [4/0,4/1,5/0,5/1,4/8,4/9,5/8,5/9,4/4,4/5,5/4,5/5,0/4,1/4,0/5,1/5,8/4,8/5,9/4,9/5]
S = [[1/6/1/0,1/7/1/0,1/8/1/0,2/4/1/0],[0/6/2/0,0/8/2/0,1/0/2/1],[0/2/3/1,0/3/3/1],[0/1/4/1]] ? ;
Reefs = [4/0,4/1,5/0,5/1,4/8,4/9,5/8,5/9,4/4,4/5,5/4,5/5,0/4,1/4,0/5,1/5,8/4,8/5,9/4,9/5]
S = [[1/6/1/0,1/7/1/0,1/8/1/0,2/5/1/0],[0/6/2/0,0/8/2/0,1/0/2/1],[0/2/3/1,0/3/3/1],[0/1/4/1]] ? ;
Reefs = [4/0,4/1,5/0,5/1,4/8,4/9,5/8,5/9,4/4,4/5,5/4,5/5,0/4,1/4,0/5,1/5,8/4,8/5,9/4,9/5]
S = [[1/6/1/0,1/7/1/0,1/8/1/0,2/6/1/0],[0/6/2/0,0/8/2/0,1/0/2/1],[0/2/3/1,0/3/3/1],[0/1/4/1]] ? ;
Reefs = [4/0,4/1,5/0,5/1,4/8,4/9,5/8,5/9,4/4,4/5,5/4,5/5,0/4,1/4,0/5,1/5,8/4,8/5,9/4,9/5]
S = [[1/6/1/0,1/7/1/0,1/8/1/0,2/7/1/0],[0/6/2/0,0/8/2/0,1/0/2/1],[0/2/3/1,0/3/3/1],[0/1/4/1]] ? ;
Reefs = [4/0,4/1,5/0,5/1,4/8,4/9,5/8,5/9,4/4,4/5,5/4,5/5,0/4,1/4,0/5,1/5,8/4,8/5,9/4,9/5]
S = [[1/6/1/0,1/7/1/0,1/8/1/0,2/8/1/0],[0/6/2/0,0/8/2/0,1/0/2/1],[0/2/3/1,0/3/3/1],[0/1/4/1]] ? ;
Reefs = [4/0,4/1,5/0,5/1,4/8,4/9,5/8,5/9,4/4,4/5,5/4,5/5,0/4,1/4,0/5,1/5,8/4,8/5,9/4,9/5]
S = [[1/6/1/0,1/7/1/0,1/8/1/0,2/9/1/0],[0/6/2/0,0/8/2/0,1/0/2/1],[0/2/3/1,0/3/3/1],[0/1/4/1]] ? ;
Reefs = [4/0,4/1,5/0,5/1,4/8,4/9,5/8,5/9,4/4,4/5,5/4,5/5,0/4,1/4,0/5,1/5,8/4,8/5,9/4,9/5]
S = [[1/6/1/0,1/7/1/0,1/8/1/0,3/0/1/0],[0/6/2/0,0/8/2/0,1/0/2/1],[0/2/3/1,0/3/3/1],[0/1/4/1]] ? ;
Reefs = [4/0,4/1,5/0,5/1,4/8,4/9,5/8,5/9,4/4,4/5,5/4,5/5,0/4,1/4,0/5,1/5,8/4,8/5,9/4,9/5]
S = [[1/6/1/0,1/7/1/0,1/8/1/0,3/2/1/0],[0/6/2/0,0/8/2/0,1/0/2/1],[0/2/3/1,0/3/3/1],[0/1/4/1]] ? ;
Reefs = [4/0,4/1,5/0,5/1,4/8,4/9,5/8,5/9,4/4,4/5,5/4,5/5,0/4,1/4,0/5,1/5,8/4,8/5,9/4,9/5]
S = [[1/6/1/0,1/7/1/0,1/8/1/0,3/3/1/0],[0/6/2/0,0/8/2/0,1/0/2/1],[0/2/3/1,0/3/3/1],[0/1/4/1]] ? ;
Reefs = [4/0,4/1,5/0,5/1,4/8,4/9,5/8,5/9,4/4,4/5,5/4,5/5,0/4,1/4,0/5,1/5,8/4,8/5,9/4,9/5]
S = [[1/6/1/0,1/7/1/0,1/8/1/0,3/4/1/0],[0/6/2/0,0/8/2/0,1/0/2/1],[0/2/3/1,0/3/3/1],[0/1/4/1]] ? ;
Reefs = [4/0,4/1,5/0,5/1,4/8,4/9,5/8,5/9,4/4,4/5,5/4,5/5,0/4,1/4,0/5,1/5,8/4,8/5,9/4,9/5]
S = [[1/6/1/0,1/7/1/0,1/8/1/0,3/5/1/0],[0/6/2/0,0/8/2/0,1/0/2/1],[0/2/3/1,0/3/3/1],[0/1/4/1]] ? ;
Reefs = [4/0,4/1,5/0,5/1,4/8,4/9,5/8,5/9,4/4,4/5,5/4,5/5,0/4,1/4,0/5,1/5,8/4,8/5,9/4,9/5]
S = [[1/6/1/0,1/7/1/0,1/8/1/0,3/6/1/0],[0/6/2/0,0/8/2/0,1/0/2/1],[0/2/3/1,0/3/3/1],[0/1/4/1]] ?
(140 ms) yes
| ?-
Reefs – рифы на карте, S – расположение координат кораблей, количество клеток каждого корабля и ориентация на карте.
Трассировка:
| ?- trace.
The debugger will first creep -- showing everything (trace)
yes
{trace}
| ?- read(Reefs),ships(S),solution(S,Reefs).
1 1 Call: read(_16) ? ;
1 1 Call: read(_16) ?
1 1 Exit: read(end_of_file) ?
2 1 Call: ships(_19) ?
2 1 Exit: ships([[_112/_113/1/0,_121/_122/1/0,_130/_131/1/0,_139/_140/1/0],[_154/_155/2/_149,_163/_164/2/_158,_172/_173/2/_167],[_185/_186/3/_180,_194/_195/3/_189],[_205/_206/4/_200]]) ?
3 1 Call: solution([[_112/_113/1/0,_121/_122/1/0,_130/_131/1/0,_139/_140/1/0],[_154/_155/2/_149,_163/_164/2/_158,_172/_173/2/_167],[_185/_186/3/_180,_194/_195/3/_189],[_205/_206/4/_200]],end_of_file) ?
4 2 Call: solution([[_154/_155/2/_149,_163/_164/2/_158,_172/_173/2/_167],[_185/_186/3/_180,_194/_195/3/_189],[_205/_206/4/_200]],end_of_file) ?
5 3 Call: solution([[_185/_186/3/_180,_194/_195/3/_189],[_205/_206/4/_200]],end_of_file) ?
6 4 Call: solution([[_205/_206/4/_200]],end_of_file) ?
7 5 Call: solution([],end_of_file) ?
7 5 Exit: solution([],end_of_file) ?
8 5 Call: solution_select([_205/_206/4/_200],end_of_file,[]) ?
9 6 Call: 4=:=1 ?
9 6 Fail: 4=:=1 ?
9 6 Call: 4=:=2 ?
9 6 Fail: 4=:=2 ?
9 6 Call: 4=:=3 ?
9 6 Fail: 4=:=3 ?
9 6 Call: 4=:=4 ?
9 6 Exit: 4=:=4 ?
10 6 Call: solution_4([_205/_206/4/_200],end_of_file) ?
11 7 Call: memberItem(_205/_206/4/_200,0,0) ?
12 8 Call: member(_205,[0,1,2,3,4,5,6,7,...]) ?
12 8 Exit: member(0,[0,1,2,3,4,5,6,7,...]) ?
13 8 Call: 0>=0 ?
13 8 Exit: 0>=0 ?
14 8 Call: member(_206,[0,1,2,3,4,5,6,7,...]) ?
14 8 Exit: member(0,[0,1,2,3,4,5,6,7,...]) ?
15 8 Call: member(_200,[0,1]) ?
15 8 Exit: member(0,[0,1]) ?
16 8 Call: 0*10+0>0*10+0 ?
16 8 Fail: 0*10+0>0*10+0 ?
15 8 Redo: member(0,[0,1]) ?
15 8 Exit: member(1,[0,1]) ?
16 8 Call: 0*10+0>0*10+0 ?
16 8 Fail: 0*10+0>0*10+0 ?
15 8 Redo: member(1,[0,1]) ?
15 8 Fail: member(_200,[0,1]) ?
14 8 Redo: member(0,[0,1,2,3,4,5,6,7,...]) ?
14 8 Exit: member(1,[0,1,2,3,4,5,6,7,...]) ?
15 8 Call: member(_200,[0,1]) ?
15 8 Exit: member(0,[0,1]) ?
16 8 Call: 0*10+1>0*10+0 ?
16 8 Exit: 0*10+1>0*10+0 ?
17 8 Call: _673 is 0+0*(4-1) ?
17 8 Exit: 0 is 0+0*(4-1) ?
18 8 Call: member(0,[0,1,2,3,4,5,6,7,...]) ?
18 8 Exit: member(0,[0,1,2,3,4,5,6,7,...]) ?
19 8 Call: _755 is 1+(1-0)*(4-1) ?
19 8 Exit: 4 is 1+(1-0)*(4-1) ?
20 8 Call: member(4,[0,1,2,3,4,5,6,7,...]) ?
20 8 Exit: member(4,[0,1,2,3,4,5,6,7,...]) ?
11 7 Exit: memberItem(0/1/4/0,0,0) ?
21 7 Call: _835 is 0+0*(4-1) ?
21 7 Exit: 0 is 0+0*(4-1) ?
22 7 Call: _872 is 1+(1-0)*(4-1) ?
22 7 Exit: 4 is 1+(1-0)*(4-1) ?
23 7 Call: noattackReef_1n(0/1/0/4,end_of_file) ?
23 7 Fail: noattackReef_1n(0/1/0/4,end_of_file) ?
11 7 Redo: memberItem(0/1/4/0,0,0) ?
20 8 Redo: member(4,[0,1,2,3,4,5,6,7,...]) ?
20 8 Fail: member(4,[0,1,2,3,4,5,6,7,...]) ?
18 8 Redo: member(0,[0,1,2,3,4,5,6,7,...]) ?
18 8 Fail: member(0,[0,1,2,3,4,5,6,7,...]) ?
15 8 Redo: member(0,[0,1]) ?
15 8 Exit: member(1,[0,1]) ?
16 8 Call: 0*10+1>0*10+0 ?
16 8 Exit: 0*10+1>0*10+0 ?
17 8 Call: _673 is 0+1*(4-1) ?
17 8 Exit: 3 is 0+1*(4-1) ?
18 8 Call: member(3,[0,1,2,3,4,5,6,7,...]) ?
18 8 Exit: member(3,[0,1,2,3,4,5,6,7,...]) ?
19 8 Call: _755 is 1+(1-1)*(4-1) ?
19 8 Exit: 1 is 1+(1-1)*(4-1) ?
20 8 Call: member(1,[0,1,2,3,4,5,6,7,...]) ?
20 8 Exit: member(1,[0,1,2,3,4,5,6,7,...]) ?
11 7 Exit: memberItem(0/1/4/1,0,0) ?
21 7 Call: _835 is 0+1*(4-1) ?
21 7 Exit: 3 is 0+1*(4-1) ?
22 7 Call: _872 is 1+(1-1)*(4-1) ?
22 7 Exit: 1 is 1+(1-1)*(4-1) ?
23 7 Call: noattackReef_1n(0/1/3/1,end_of_file) ?
23 7 Fail: noattackReef_1n(0/1/3/1,end_of_file) ?
11 7 Redo: memberItem(0/1/4/1,0,0) ?
20 8 Redo: member(1,[0,1,2,3,4,5,6,7,...]) ?
20 8 Fail: member(1,[0,1,2,3,4,5,6,7,...]) ?
18 8 Redo: member(3,[0,1,2,3,4,5,6,7,...]) ?
18 8 Fail: member(3,[0,1,2,3,4,5,6,7,...]) ?
15 8 Redo: member(1,[0,1]) ?
15 8 Fail: member(_200,[0,1]) ?
14 8 Redo: member(1,[0,1,2,3,4,5,6,7,...]) ?
14 8 Exit: member(2,[0,1,2,3,4,5,6,7,...]) ?
15 8 Call: member(_200,[0,1]) ?
15 8 Exit: member(0,[0,1]) ?
16 8 Call: 0*10+2>0*10+0 ?
16 8 Exit: 0*10+2>0*10+0 ?
17 8 Call: _673 is 0+0*(4-1) ?
17 8 Exit: 0 is 0+0*(4-1) ?
18 8 Call: member(0,[0,1,2,3,4,5,6,7,...]) ?
18 8 Exit: member(0,[0,1,2,3,4,5,6,7,...]) ?
19 8 Call: _755 is 2+(1-0)*(4-1) ?
19 8 Exit: 5 is 2+(1-0)*(4-1) ?
20 8 Call: member(5,[0,1,2,3,4,5,6,7,...]) ?
20 8 Exit: member(5,[0,1,2,3,4,5,6,7,...]) ?
11 7 Exit: memberItem(0/2/4/0,0,0) ?
21 7 Call: _835 is 0+0*(4-1) ?
21 7 Exit: 0 is 0+0*(4-1) ?
22 7 Call: _872 is 2+(1-0)*(4-1) ?
22 7 Exit: 5 is 2+(1-0)*(4-1) ?
23 7 Call: noattackReef_1n(0/2/0/5,end_of_file) ?
23 7 Fail: noattackReef_1n(0/2/0/5,end_of_file) ?
11 7 Redo: memberItem(0/2/4/0,0,0) ?
20 8 Redo: member(5,[0,1,2,3,4,5,6,7,...]) ?
20 8 Fail: member(5,[0,1,2,3,4,5,6,7,...]) ?
18 8 Redo: member(0,[0,1,2,3,4,5,6,7,...]) ?
18 8 Fail: member(0,[0,1,2,3,4,5,6,7,...]) ?
15 8 Redo: member(0,[0,1]) ?
15 8 Exit: member(1,[0,1]) ?
16 8 Call: 0*10+2>0*10+0 ?
16 8 Exit: 0*10+2>0*10+0 ?
17 8 Call: _673 is 0+1*(4-1) ?
17 8 Exit: 3 is 0+1*(4-1) ?
18 8 Call: member(3,[0,1,2,3,4,5,6,7,...]) ?
18 8 Exit: member(3,[0,1,2,3,4,5,6,7,...]) ?
19 8 Call: _755 is 2+(1-1)*(4-1) ?
19 8 Exit: 2 is 2+(1-1)*(4-1) ?