Скачиваний:
10
Добавлен:
01.05.2014
Размер:
107.01 Кб
Скачать

Министерство образования Российской Федерации

Санкт-Петербургский Государственный Электротехнический Университет «ЛЭТИ»

Кафедра МО ЭВМ

Отчет по лабораторной работе

По дисциплине:

«Функциональное и логическое программирование»

Санкт-Петербург

2007

  1. Морской бой.

Дан квадрат 10х10 и корабли (14 шт, 23 шт,32 шт, 41 шт). В качестве исходных данных рифы на карте. Необходимо так разместить корабли, чтобы они не попадали на рифы.

  1. При выполнении работы исходные данные читаются из файла, в данной лабораторной работе ИД – рифы на карте, которые изначально известны.

0 1 2 3 4 5 6 7 8 9

р

р

р

р

р

р

р

р

р

р

р

р

р

р

р

р

р

р

р

р

Листинг программы разбивается на несколько секций

  1. MAIN PROCEDURE

  2. SELECT SOLUTION OF EACH STEP

  3. CHOOSE THE POSITIONS OF 4 SHIPS 1X1

  4. CHOOSE THE POSITIONS OF 3 SHIPS 1X2

  5. CHOOSE THE POSITIONS OF 2 SHIPS 1X3

  6. CHOOSE THE POSITION OF 1 SHIP 1X4

  7. INITIATE THE POSITION OF 1 SHIP

  8. PREVENT THE SHIPS FROM DRIVING INTO REEFS

  9. PREVENT THE SHIPS FROM DRIVING INTO TOGETHER

  10. 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, где происходит проверка отличия координат клетки корабля и рифа(либо координат клетки существующего корабля).

  1. Исходный текст программы:

%-------------------------------------------------------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]]).

  1. Компиляция программы, формат исходных данных.

Ид находятся в файле 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) ?

Соседние файлы в папке Морской бой в Прологе