пару идей по поводу path...
От: Аноним  
Дата: 26.05.07 17:35
Оценка:
Здравствуйте!

Есть БД на прологе, описывающая улицы города (задание в конце письма).
Что-то типа этого:
object('улица','Жуковского',
[
    ['налево','проспект','Литейный',53,'назад'],
    ['направо','проспект','Литейный',55,'вперед'],
    [1,3,5,7,9,11,13],
    [2,4,6,8,10],
    ['налево','улица','Чехова',1,'вперед'],
    [15,17,19,21,23,25],
    [12,14],
    ['налево','улица','Маяковского',9,'вперед'],
    ['направо','улица','Маяковского',7,'назад'],
    [27,29,31,33,35,37,39,41,43,45,47,49,51],
    [16,18,20,22,24,26,28],
    ['налево','улица','Восстания',21,'вперед'],
    ['направо','улица','Восстания',19,'назад'],
    [53,55,57],
    [30,32,34],
    ['налево','улица','Радищева',1,'вперед'],
    [59,61,63,65],
    [36,38],
    ['налево','проспект','Лиговский',19,'назад'],
    ['направо','проспект','Лиговский',21,'вперед']
]).

object('набережная','Кутузова',
[
    ['начало','набережная','Робеспьера'],
    ['налево','проспект','Литейный',1,'вперед'],
    ['направо','Мост','Литейный',-1,'назад'],
    [],
    [2],
    ['налево','переулок','Кричевский',1,'вперед'],
    [],
    [4,6,8,10,12,14,16,18,20,22],
    ['налево','улица','Гагаринская',1,'вперед'],
    [],
    [24,26,28,30,32,34,36],
    ['налево','набережная','реки Фонтанки',-1,'вперед'],
    ['налево','набережная','Лебяжьего канала',-1,'вперед'],
    ['конец','набережная','Дворцовая']
]).


Соответственно, каждый поворот представляет собой такой же объект.

Так вот, что нужно сделать:

Составить отношение
path(Source,Target,M).

Аргумент Source — список — содержит указание на конкретный объект
из созданной на первом этапе базе данных в формате [Type,Name,Building],
где
Type — тип объекта (улица, площадь, проезд, переулок и т.п.),
Name — имя объекта,
Building — номер конкретного дома.


Аргумент Target — список — содержит указание на конкретный объект
из созданной на первом этапе базе данных в формате [Type,Name,Building],
где
Type — тип объекта (улица, площадь, проезд, переулок и т.п.),
Name — имя объекта,
Building — номер конкретного дома.

Аргумент M — список — содержит описание маршрута от первого объекта
до второго объекта в формате, совпадающем с форматом описания улиц
(при этом от проходимых улиц содержится только тот участок, по которому
проходит маршрут).


Просьба подкинуть пару мыслей, ибо решение тупым перебором, мне кажется, просто скушает стек. А проверить реализацией... Ну, пролог для меня довольно сложен, нежели какой-нибудь императивный язык, поэтому хочется сразу знать, что кодируемое мной решение чисто алгоритмически верно.

Вот по каким правилам описывались улицы:

для заданного набора улиц построить
базу данных, состоящую из правил, имеющих вид:
object (Type, Name, List).
Type — тип объекта (улица, площадь, проезд, переулок и т.п.),
Name — имя объекта,
List — описание самого объекта в виде списка.
Например object ("улица","Московская",[1,3,5],[2,4,6],
["налево","улица","Аграрная",11,"назад"],
["направо","проезд","Поперечный",3,"вперед"],
[7,11,13],[10,12,14]]
Элементами списка являются подсписки следующего вида: часть подсписков
перечисляет номера домов, расположенных в порядке возрастания в пределах
одного квартала, при этом сначала идёт подсписок с нечётными номерами,
затем — с чётными номерами. Между списками, соответствующими кварталам,
находятся списки, определяющие возможные повороты в пересекающие улицы,
имеющие вид:
в первом подсписке указано слово "налево", затем — тип улицы, название
улицы, номер первого нечётного дома (на углу улицы, куда происходит
поворот), а также направление движения ("вперед", либо "назад");

во втором подсписке указано слово "направо", затем — тип улицы,
название улицы, номер первого нечётного дома (на углу улицы, куда
происходит поворот), а также направление движения ("вперед", либо
"назад").
Предполагается, что движение вперед идёт от меньшего номера дома к большему
вдоль улицы. Если поворот только в одну сторону, то записывается один
соответствующий подсписок.
Замечание.
Если начало улицы приходится на пересечение с некоторой другой улицей, то
список описания предваряется описанием поворотов, аналогично и для конца улицы.
Если начало улицы является продолжением некоторой другой улицы, то предваряем
описание списком, состоящим из подсписка, первым атомом которого является
слово "начало" либо "конец", а следующими — тип и имя объекта, откуда
происходит вытекание описанной улицы. Аналогично и для конца улицы.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.