Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
 Аватар для Skynin
2 / 2 / 0
Регистрация: 29.09.2008
Сообщений: 9

Проектирование программы на Прологе

15.03.2011, 22:46. Показов 2041. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задумал использовать в качестве ядра обработки логики Prolog.

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

Но в реальной программе база данных будет пуста. А потом она будет изменяться.
Если взять SQL (по аналогии декларативности Prolog'а) то в результате истинности условия UPDATE мы получим измененные данные.

Поясню на примере свое непонимание:

Отрывок из книги Братко:

Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
op( 50, xfy, ':').
% БАЗА ДАННЫХ О РЕЙСАХ САМОЛЕТОВ
 
расписание( милан, лондон,
      [ 9:10 / 10:00 / az458 / ежедневно,
    12:20 / 13:10 /511 / ежедневно ] ).
 
расписание( милан, цюрих,
      [ 9:25 / 10:15 / sr621 / ежедневно,
    12:45 / 13:35 / sr623 / ежедневно ] ).
 
расписание( цюрих, любляна,
      [13:30 / 14:40 / yu323 / [вт, чт] ] ).
 
% Предикаты
 
день_выл( День, СписДней) :-
      принадлежит( День, СписДней).
 
день_выл( День, ежедневно) :-
      принадлежит( День, [пн, вт, ср, чт, пт, сб, вс] ).
А теперь вопросы:
1. Для работы с базой данных нужно написать свой UPDATE (с помощью asserta и assertz, retract)?
Причем с проверкой ситуации:
Уже есть факт:
Prolog
1
2
расписание( милан, лондон,
      [ 9:10 / 10:00 / az458 / ежедневно]).
Чтобы добавить новый рейс
12:20 / 13:10 / bа511 / ежедневно
мой UPDATE должен:
проверить существование факта расписание( милан, лондон, X)
если такой есть
удалить факт
добавить к списку X наш новый рейс, если такого рейса еще не было
добавить в базу факт

2.1 Нужно заменить время вылета в рейсах из цюриха, увеличив скажем все на полчаса.
получаем расписание( цюрих, X, Y)
удаляем факт из базы
получаем все элементы списка
"выкусываем" время вылета, обрабатываем увеличивая,
создаем новый рейс, копируя все из старого кроме времени вылета,
добавляем в базу новый факт (UPDATE с проверкой уже написан, выше)

2.2, 2.3, ... заменить название рейса, дни вылета

То же самое с удалением, создавать свой DELETE?

3. Как быть с ситуациями
пытаемся добавить рейс, имя которого уже где-то используется, а рейсы должны встречаться только раз. Написать проверку-поиск по всем фактам?

4. Если нужно ввести кроме ежедневно повыходным то тогда:
нужно обрабатывать не в предикате, а создавать фактом:
ежедневно([пн, вт, ср, чт, пт, сб, вс]).
?
или добавить предикат день_выл( День, повыходным) :-?

То есть, для того чтобы работать с базой фактов, нужно вначале написать свой набор средств ее изменения, учитывающий формат хранения фактов, и обслуживающие предикаты, аналоги SELECT?
Вначале - создаем инфраструктуру работы с базой фактов, а потом уж...
Я в верном направлении мыслю?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.03.2011, 22:46
Ответы с готовыми решениями:

Написанием программы на Прологе
2 задания 1. замена в исходном списке из неоднородных элементов двух подряд идущих элементов одним 2.преобразовать строки в списки...

Проверка правильности работы программы на прологе
Здравствуйте. Возникла проблема. По сети получаю файл с текстом программы на прологе. Необходимо проверить работоспособность и...

4 программы на прологе (база знаний, работа со списками, графические возможности и функция)!
1. Создать базу данных о заданной предметной области в виде множества фактов языка Пролог (не менее 5 фактов). Информацию о каждом...

3
Заблокирован
15.03.2011, 23:58
Цитата Сообщение от Skynin Посмотреть сообщение
То есть, для того чтобы работать с базой фактов, нужно вначале написать свой набор средств ее изменения, учитывающий формат хранения фактов, и обслуживающие предикаты, аналоги SELECT?
Вначале - создаем инфраструктуру работы с базой фактов, а потом уж...
Я в верном направлении мыслю?
да. Все остальное прочитал, вроде бы все верно.
Все примеры для изучения Prolog уже содержат базу фактов и операций над ними.

Но в реальной программе база данных будет пуста. А потом она будет изменяться.
Базу данных можно загружать из внешнего файла, и сохранять в текстовый файл. В прологе можно использовать и другие форматы БД(импортировать и экспортировать), я не использовал, но точно видел что используется DBF формат. Надеюсь я правильно понял ваш вопрос.
0
 Аватар для Skynin
2 / 2 / 0
Регистрация: 29.09.2008
Сообщений: 9
16.03.2011, 10:55  [ТС]
Цитата Сообщение от rrrFer Посмотреть сообщение
да. Все остальное прочитал, вроде бы все верно.
Смущает потенциальный объем кода для обслуживания, когда данные будут реальные, то есть сложные (дерево списков элементами первого списка являются списки, элементами которых...; элементами второго являются структуры, первым полем которых являются списки, ...). Ведь для изменения значения, ввиду иммутабельности данных нужно будет удалять весь факт, и формировать новый.

Но раз по другому никак, то попробую.

Цитата Сообщение от rrrFer Посмотреть сообщение
Базу данных можно загружать из внешнего файла,
За работу с внешним миром будут отвечать части программы на другом языке.

Конечно, нужно продумать метод обновления внешних данных -
1. параллельно: пишем в пролог БД; пишем во внешнюю БД,
или
2. пишем в пролог БД, получаем из пролог БД измененные факты, записываем их(или изменения) во внешнюю БД.

В первом случае возможно рассогласование данных. Во втором - потеря скорости выполнения.
0
Заблокирован
16.03.2011, 12:13
Цитата Сообщение от Skynin Посмотреть сообщение
Но раз по другому никак, то попробую.
Да, в прологе отсутствует разрушающее присваивание, значит что если у нас есть список из тысячи элементов и надо удалить лишь один элемент - то на прологе надо создать новый список, без одного элемента ) Т.е. то, что один раз получило значение - никогда его не изменит, хотя есть диалекты пролога, позволяющие использовать разрушающее присваивание.
Цитата Сообщение от Skynin Посмотреть сообщение
Конечно, нужно продумать метод обновления внешних данных -
оба метода сильно замедлят работу, т.к. внешняя БД это просто файл(текстовый, можно редактировать в блокноте). Обработка файла выполняется весьма медленно, поэтому, возможно не стоит постоянно писать во внешнюю БД, а выполнять все во внутренней БД, а во внешнюю БД сохранять по команде, хотя тогда страдает надежность, т.к. все не сохраненные данные будут надежно потеряны, например, при выключении света.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.03.2011, 12:13
Помогаю со студенческими работами здесь

Проектирование программы
В лабораторной работе есть следующий пример. "Допустим, необходимо спроектировать программу, которая осуществляет чтение,...

Проектирование программы
Здравствуйте! Подскажите пожалуйста, какими средствами эффективнее проектировать и рекодить программу? Тема стала актуальна с...

Проектирование ООП программы
Привет, начал писать большие программы, без планирования, в итоге , приходится переписывать по 100 раз, что посоветуете, как правильно...

Проектирование программы на Python-е
Планирую переписать одну программку, вот как я это себе представляю. Возникло два вопроса: Какую взять БД? Нужна наиболее доступная...

Проектирование программы для проката
Всем привет! Недавно открыл собственное дело - прокат. В связи с избытком обрабатываемой информации мне захотелось автоматизировать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru