расписание( лондон, милан,

 [ 8:30 / 11:20 / bа510 / ежедневно,

   11:00 / 13:50 / az459 / ежедневно ] ).

расписание( любляна, цюрих,

 [11:30 / 12:40 / ju322 / [вт,чт] ] ).

расписание( любляна, лондон,

 [11:10 / 12:20 / yu200 / [пт],

  11:25 / 12:20 / yu212 / [вс] ] ).

расписание( милан, лондон,

 [ 9:10 / 10:00 / az458 / ежедневно,

   12:20 / 13:10 / bа511 / ежедневно ] ).

расписание( милан, цюрих,

 [ 9:25 / 10:15 / sr621 / ежедневно,

   12:45 / 13:35 / sr623 / ежедневно ] ).

расписание( цюрих, любляна,

 [13:30 / 14:40 / yu323 / [вт, чт] ] ).

расписание( цюрих, лондон,

 9:00 / 9:40 / bа613 /

 [ пн, вт, ср, чт, пт, сб],

   16:10 / 16:55 / sr806 / [пн, вт, ср, чт, пт, сб] ] ).

расписание( цюрих, милан,

 [ 7:55 / 8:45 / sr620 / ежедневно ] ).

Рис. 4.5.  Планировщик воздушных маршрутов и база данных о рейсах самолетов.

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

• По каким дням недели существуют прямые рейсы из Лондона в Люблину?

?- рейс( лондон, любляна, День, _, _, _ ).

День = пт;

День = сб;

no        (нет)

• Как мне добраться из Любляны в Эдинбург в четверг?

?- маршрут( любляна, эдинбург, чт, R).

R = [любляна-цюрих : уu322 : 11:30, цюрих-лондон:

     sr806 : 16:10,

     лондон-эдинбург : bа4822 : 18:40 ]

• Как мне посетить Милан, Любляну и Цюрих, вылетев из Лондона во вторник и вернувшись в него в пятницу, совершая в день не более одного перелета? Этот вопрос сложнее, чем предыдущие. Его можно сформулировать, использовав отношение перестановка, запрограммированное в гл. 3. Мы попросим найти такую перестановку городов Милан, Любляна и Цюрих, чтобы соответствующие перелеты можно было осуществить в несколько последовательных дней недели:

?- перестановка( [милан, любляна, цюрих],

 [Город1, Город2, Город3] ),

 рейс( лондон, Город1, вт, Np1, Oтпp1, Пpиб1),

 peйc( Город1, Город2, ср, Np2, Отпр2, Приб2),

 рейс( Город2, Город3, чт, Np3, Отпp3, Приб3),

 рейс( Город3, лондон, пт, Np4, Отпр4, Приб4).

Город1 = милан

Город2 = цюрих

Город3 = любляна

Np1 = ba510

Отпр1 = 8:30

Приб1 = 11:20

Np2 =sr621

Отпр2 = 9:25

Приб2 = 10:15

Np3 = yu323

Отпр3 = 13:30

Приб3 = 14:40

Np4 = yu200

Отпр4 = 11:10

Приб4 = 12:20

4.5. Задача о восьми ферзях

Эта задача состоит в отыскании такой расстановки восьми ферзей на пустой шахматной доске, в которой ни один из ферзей не находится под боем другого. Решение мы запрограммируем в виде унарного отношения:

решение( Поз)

которое истинно тогда и только тогда, когда Поз изображает позицию, в которой восемь ферзей не бьют друг друга. Будет интересно сравнить различные идеи, лежащие в основе программирования этой задачи. Поэтому мы приведем три программы, основанные на слегка различающихся ее представлениях.

4.5.1. Программа 1

Вначале нужно выбрать способ представления позиции на доске. Один из наиболее естественных способов — представить позицию в виде списка из восьми элементов, каждый из которых соответствует одному из ферзей. Каждый такой элемент будет описывать то поле доски, на которой стоит

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату