Программирование на языке Пролог для искусственного интеллекта [Иван Братко] (fb2) читать постранично, страница - 150


 [Настройки текста]  [Cбросить фильтры]

 HoвoeN1 is N1 + 1,

 между( HoвoeN1, N2, X).

3.22

:- op( 900, fx, если).

:- op( 800, xfx, то).

:- op( 700, xfx, иначе).

:- op( 600, xfx, :=).


если Вел1 > Вел2 то Перем := Вел3

 иначе ЧтоУгодно :-

 Вел1 > Вел2,

 Перем = Вел3.

если Вел1 > Вел2 то ЧтоУгодно

 иначе Перем := Вел4 :-

 Вел1 =< Вел2,

 Перем = Вел4.

Глава 4
4.1

(a) ?- семья(членсемьи( _, Фамилия, _, _ ), _, []).

(b) ?- ребенок( членсемьи( Имя, Фамилия, _,

    работает( _, _ ) )).

(c) семья(членсемьи( _, Фамилия, _, неработает),

    членсемьи( _, _, _, работает( _, _ ) ),_ ).

(d) ?- семья( Муж, Жена, Дети),

    датарождения( Муж, дата( _, _, Год1) ),

    датарождения( Жена, дата( _, _, Год2) ),

    ( Год1 - Год2 >= 15;

      Год2 - Год1 >= 15 ),

    принадлежит( Ребенок, Дети).

4.2

близнецы( Ребенок1, Ребенок2) :-

 семья( _, _, Дети),

 удалить( Ребенок1, Дети, ДругиеДети),

  % Выделить первого ребенка

 принадлежит( Ребенок2, ДругиеДети),

 принадлежит( Ребенок1, Дата),

 принадлежит( Ребенок2, Дата).

4.3

n_элемент( 1, [X | L], X).

  % X - первый элемент списка [X | L]

n_элемент( N, [Y | L], X) :-

  % X - n-й элемент [Y | L]

 N1 is N - 1,

 n_элемент( N1, L, X).

4.4

Входная цепочка укорачивается на каждом неспонтанном цикле, а укорачиваться бесконечно она не может.

4.5

допускается( S, [], _ ) :-

 конечное( S).

допускается( S, [X | Остальные], Макс_переходов) :-

 Макс_переходов > 0,

 переход( S, X, S1),

 НовыйМакс is Макс_переходов - 1,

 допускается( S1, Остальные, НовыйМакс).

допускается( S, Цепочка, Макс_переходов) :-

 Макс_переходов > 0,

 спонтанный( S, S1),

 НовыйМакс is Макс_переходов - 1,

 допускается( S1, Цепочка, НовыйМакс).

4.7

(а) ходконя( X/Y, X1/Y1) :-

     % Ход коня с поля X/Y на поле X1/Y1

    ( dxy( DX, DY);

     % Расстояния по направлениям X и Y

    dxy( DY, DX) ),

     % Или расстояния по направлениям Y и X

    X1 is X + DX,

     % X1 расположен в пределах шахматной доски

    надоске( X1),

    Y1 is Y + DY,

     % Y1 расположен в пределах шахматной доски

    надоске( Y1).


   dxy( 2, 1).   % 2 поля вправо, 1 поле вперед

   dxy( 2, -1).  % 2 поля вправо, 1 поле назад

   dxy( -2, 1).  % 2 поля влево, 1 поле вперед

   dxy( -2, -1). % 2 поля влево, 1 поле назад


   надоске( Коорд) :-

     % Координаты в пределах доски

    0 < Коорд,

    Коорд < 9.

(b) путьконя( [ Поле]). % Конь стоит на поле Поле

   путьконя( [S1, S2 | Остальные] ) :-

    ходконя( S1, S2),

    путьконя( [S2 | Остальные]).

(c) ?- путьконя( [2/1, R, 5/4, S, X/8] ).

Глава 5
5.1

(a) X = 1;

   X = 2

(b) X = 1;

   Y = 1;


   X = 1;

   Y = 2;


   X = 2;

   Y = 1;


   X = 2;

   Y = 2;

(c) X = 1;

   Y = 1;


   X = 1;

   Y = 2;

5.2

класс( Число, положительное) :-

 Число > 0, !.

класс( 0, нуль) :- !.

класс( Число, отрицательное).

5.3

разбить( [], [], []).

разбить( [X | L], [X | L1], L2) :-

 X >= 0, !,

 разбить( L, L1, L2).

разбить( [X | L], L1, [X | L2]) .

 разбить( L, L1, L2).

5.4

принадлежит( Некто, Кандидаты),

 not принадлежит( Некто, Исключенные)

5.5

разность( [], _, []).

разность( [X | L1], L2, L):-

 принадлежит( X, L2), !,

 разность( L1, L2, L).

разность( [X | L1], L2, [X | L]) :-

 разность( L1, L2, L).

5.6

унифицируемые( [], _, []).

унифицируемые( [Первый | Остальные], Терм, Список) : -

 not( Первый = Терм), !,

 унифицируемые( Остальные, Терм, Список).

унифицируемые( [Первый | Остальные], Терм,

 [Первый | Список] ) :-

 унифицируемые( Остальные, Терм, Список).

Глава 6
6.1

найтитерм( Терм) :-

  % Пусть текущий входной поток - это файл f

 read( Терм), !,

  % Текущий терм из f сопоставим с Терм'ом?

 write( Терм);      % Если да - вывести его на терминал

  найтитерм( Терм). % В противном случае - обработать

6.2

найтитермы( Терм) :-

 read( ТекущийТерм),

 обработать( ТекущийТерм, Терм).


обработать( end_of_file, _ ) :- !.

обработать( ТекущийТерм, Терм) :-

 ( not( ТекущийТерм = Терм), !;

    % Термы несопоставимы

 write( ТекущийТерм), nl),

  % В противном случае вывести текущий терм

 найтивсетермы( Терм).

  % Обработать оставшуюся часть файла

6.4

начинается( Атом, Символ) :-

 name( Символ, [ Код]),

 name( Атом, [Код | _ ]).

6.5

plural( Существительное, Существительные) :-

 name( Существительное, СписокКодов),

 name( s, КодS),

 конк( СписокКодов, КодS, НовыйСписокКодов),

 name( Существительные, НовыйСписокКодов).

Глава 7
7.2

добавить( Элемент, Список) :-

 var( Список), !,

  % Переменная Список представляет пустой список

Список = [Элемент | Хвост].

добавить( Элемент, [ _ | Хвост]) :-

 добавить( Элемент, Хвост).


принадлежит( X, Список) :-

 var( Список), !,

  % Переменная Список представляет пустой список,

  % поэтому X не может ему принадлежать

 fail.

принадлежит( X, [X | Хвост]).

принадлежит( X, [ _ | Хвост] ) :-

 принадлежит( X, Хвост).

Глава 8
8.2

добавить_в_конец( L1-[Элемент | Z2], Элемент, L1 - Z2).

8.3

обратить(