Привет! Как в классическом прологе запустить программу на выполнение? consult ? Чё то у меня не получается. Я раньше писал на прологе, а теперь вот забыл, вышибло.
Я пишу: ?-consult(‘c:/prolog/test.p’). отвечает: no Почему? Что я не так делаю? %
Код к задаче: «Как запустить программу?»
Листинг программы
?- consult(‘c:\prolog\test’).
13голосов , оценка 4.000из 5
Похожие ответы
- Подскажите пожалуйста, как доделать код
- Объясните, пожалуйста, как работает прога
- В какой среде запустить этот программный код?
- Как исправить ошибку The predicate ‘main::a/2 (o,i)’, which is declared as ‘procedure’, is actually ‘determ’
- Определите, на каких маршрутах можно добраться от остановки X до остановки Y
- Как ввести с клавиатуры вещественное число? (Visual Prolog 7.3)
- Определить, какой будет день недели через N дней, если сегодня день недели S
- Как можно переписать код, чтобы при невыполнении правила что-то выводилось?
- Как правильно написать факт в Prologe?
- Как осуществить поиск наибольшего из 4 чисел?
Все виды студенческих работ на заказ
Prolog 2: Установка и работа с SWI Prolog
Источник: studassistent.ru
TurboProlog с нуля
Добрый день, мальчики и девочки, мужчины и женщины, дамы и господа.
Если Вы в первый раз столкнулись с необходимостью написать программу на Prolog, то это статья для Вас.
Prolog– это язык логического программирования, который отличается от стандартных языков императивного программирования (Pascal, Basic, С и т.д.), но он не так сложен в понимании, как может сначала показаться.
Первым делом нужно решить, какую систему логического программирования Вы будете использовать. Самая простая, созданная еще в далеких 80х, является TurboProlog.
Она похожа, например, на TurboPascal, TurboBasic. И если Вы встречались с такими компиляторами, то особых затруднений с TurboPrologне возникнет. Есть, конечно, более современные компиляторы, которые Вы можете использовать (Visual Prolog, Amzi! Prolog, ALS Prolog).
TurboPrologне запустится на ОС 64-bit . Поэтому придется искать альтернативные варианты.
Качаем нашу программу (например здесь ) и запускаем PROLOG.EXE.
Конечно же, забываем про мышь, всё управление на клавиатуре. При нажатии «Esc» происходит переключение в меню. Сначала у нас загружается пустой файл WORK.PRO.
Выберем Files ->Writetoи тем самым создадим новый файл со своим именем, например Prog.pro.Сохраняется файл в данном случае в той же папке, где находится программа TurboProlog, иначе нужно прописывать полный путь.
Урок 2. Простая программа на Visual Prolog
Для перехода в режим редактирования в меню выбираем Edit, «Enter», и можем творить.
Разбираем основы Prolog
Основные секции программы Prolog это — PREDICATES и CLAUSES .
Так же есть директивы:
CONSTANTS — раздел описания констант;
DOMAINS — раздел описания доменов;
DATABASE — раздел описания предикатов внутренней базы данных;
GOAL — раздел описания внутренней цели.
В секции DOMAINS объявляются домены, они подобны типам данных. Используется для удобства, при описании разных объектов с одинаковыми типами. Этот раздел можно опустить.
Стандартные типы Prolog:
integer— целое число
real— действительное число
string— последовательность символов типа char, которая заключена в кавычки
symbol— последовательность букв латинского алфавита, цифр и знаков подчеркивания, которая начинается со строчной буквы или заключена в кавычки.
name = symbol count = integer price = integer
В секции PREDICATES перечисляются объявления предикатов с их типами. По сути это похоже на прототипы функций в императивных языках. Мы задаем шаблоны для последующего определения фактов (истинных утверждений) и правил, то есть процедур над переменными.
sum(integer,integer) book(name, count, price) search(name) search(price, price)
Здесь можно увидеть удобство использования ранее объявленных доменов, все параметры наглядны. Без использования доменов выглядело бы так:
book(symbol, integer, integer) search(symbol) search(integer, integer)
Предикат может быть без перечисления доменов, например:
all_info
Заметьте, никаких символов в конце инструкций нет.
В секции CLAUSES помещаются факты и правила. Каждое предложение должно заканчиваться точкой.
Сначала мы задаем известные истинные утверждение.
Например предложение “Книга «Война и мир» имеется в 3 экземплярах, стоимость одной книги 50” , исходя из того, что есть предикат book(name, count, price)
факт будет выглядеть так:
book(«War and peace», 3, 50).
После задания фактов, задаем правила определения истинности задаваемого нами предложения, или просто последовательность каких-то действий.
Например, поиск книг по имени:
search(X):- book(X,C,P), write(«`», X, «`», » count: «, C, » price: «, P), nl.
X – приходящая переменная с типом name (symbol). С, P – локальные переменные, nl – переход на следующую строку.
Как происходит работа программы?
При задании целей используется директива GOAL , или если ее нет, цели задаются в диалоговом окне при запуске программы.
Например, задавая цель: search(“War and peace”) , происходит последовательная проверка по условиям, то есть всё, что стоит после CLAUSES.
- book(«War and peace», 3, 50). – не подходит
- search(X):- book(X,C,P), write(«`», X, «`», » count: «, C, » price: «, P), nl. – подходит.
- Вызывается book(«War and peace»,C,P), и заново происходит поиск с начала.
- book(«War and peace», 3, 50). – подходит
- В С попадает 3, а в P – 50.
- Наш вывод: ‘War and peace’ count: 3, price: 5
Вернемся к TurboProlog.
Напишем такую программу.
PREDICATES bird(symbol) parent(symbol,symbol) CLAUSES % Воробей – это птица. bird(sparrow). %X – это птица, если у него есть родитель, который является птицей. bird(X):–parent(Y,X), bird(Y). % Воробей – родитель птенца. parent(sparrow,nestling).
Теперь для запуска жмем «Esc», Run. И если Вы написали без ошибок, должны увидеть диалоговое окно.
И начинаем вводить наши данные, жмем «Enter» и программа на них отвечает либо Yes, либо No, или ошибку с ее описанием.
Так же запрашиваемые предложения можно писать в коде, после директивы GOAL , тогда при запуске будет сразу выводиться ответ.
Существуют еще анонимные переменные, которые задаются в виде нижнего подчеркивания _, то есть, это может быть всё что угодно. В данной программе при попадании в bird(X):–, предикат parent(Y,X) вызывается с анонимным параметром Y например, parent(_, pigeon). Это можно увидеть при трассировке.
Для отладки программы можно использовать трассировку. («Esc», Edit) Для этого в начале нашей программы напишем trace, запустим. Вводим предложение -> «Enter» ->F10.
Попадаем в наш код и проходим по нему с помощью F10 ,в нижнем правом углу выводятся данные трассировки.
Сообщения в окне трассировки могут быть следующими:
− CALL – вывод имени предиката и значений его параметров;
− FAIL – вывод имени неудачно завершившегося предиката;
− REDO – вывод сообщения о том, произведен поиск с возвратом;
− RETURN – вывод имени удачно завершившегося предиката и значений его параметров.
Не забываем сохранять: Files ->Save.
Для правильного выхода: Files ->Quit.
Ставим лайки, подписываемся на рассылку =)
Удачи в написании своих программ!
Автор статьи: Leomana. 04.2013
Источник: alexdev.ru
Prolog Language учебник
Начало работы с языком Prolog
append/3 является одним из самых известных отношений Prolog. Он определяет связь между тремя аргументами и является истинным, еслитретий аргумент представляет собой список, который обозначает объединение списков, указанных в первом и втором аргументах.
Примечательно, что, как и для хорошего кода Prolog, append/3 можно использовать в нескольких направлениях: его можно использовать для:
-
добавьтедва полностью или частично созданных списка:
?- A = [1, 2, 3], B=[4, 5, 6], append(A, B, Y) Output: A = [1, 2, 3], B = [4, 5, 6], Y = [1, 2, 3, 4, 5, 6].
?- A = [1, 2, 3], B = [4, 5], C = [1, 2, 3, 4, 5, 6], append(A, B, C) Output: false
?- append(A, B, [1, 2, 3, 4]). Output: A = [], B = [1, 2, 3, 4] ; A = [1], B = [2, 3, 4] ; A = [1, 2], B = [3, 4] ; A = [1, 2, 3], B = [4] ; A = [1, 2, 3, 4], B = [] ; false.
Ограничения CLP (FD)
Ограничения CLP (FD)предоставляются всеми серьезными реализациями Prolog. Они позволяют нам рассуждать о целых числахчистым способом.
?- X #= 1 + 2. X = 3. ?- 5 #= Y + 2. Y = 3.
Программирование баз данных
Пролог классифицирует все на:
- Атомы- любая последовательность символов, которые не начинаются с прописного алфавита. Например — a , b , okay
- Числа- для чисел нет специального синтаксиса, объявление не требуется. Например, 1 , 22 , 35.8
- Переменные- строка, начинающаяся с символа верхнего регистра или подчеркивания ( _ ). Например, X , Y , Abc , AA
- Сложные термины- они сделаны из функтораи последовательности аргументов. Имя комплексного члена всегда является атомом, а аргументы могут быть либо атомами, либо переменными. Например, father(john,doe) , relative(a) , mother(X,Y) .
Логическая база данных содержит набор фактови правил.
Сложный член с атомами в качестве аргументов называется фактом, а сложный член с переменными в качестве аргументов называется правилом.
Пример фактов в Прологе:
father_child(fred, susan). mother_child(hillary, joe).
Пример правила в Prolog:
child_of(X,Y):- father_child(Y,X) ; mother_child(Y,X).
Обратите внимание, что ; здесь как оператор or на других языках.
Prolog — это декларативный язык, и вы можете прочитать эту базу данных следующим образом:
Для всех X и Y X является дочерним элементом Y если Y является отцом X или Y является матери X
Фактически, конечный набор фактов и / или правил представляет собой логическую программу.
Использование такой программы демонстрируется путем выполнения запросов. Запросы позволяют извлекать информацию из логической программы.
Чтобы загрузить базу данных в интерпретатор (если вы сохранили базу данных в каталоге, в котором запущен интерпретатор), вы просто вводите:
?- [nameofdatabase].
заменив имя nameofdatabase на фактическое имя файла (обратите внимание, что здесь мы исключаем расширение .pl в имя файла).
Пример запросов в интерпретаторе для программы выше и результатов:
?- child_of(susan,fred). true ?- child_of(joe,hillary). true ?- child_of(fred,susan). false ?- child_of(susan,hillary). false ?- child_of(susan,X). X = fred ?- child_of(X,Y). X = susan, Y = fred ; X = joe, Y = hillary.
Запросы выше и их ответы можно прочитать следующим образом:
является ли судан ребенком Фреда? — правда
Вот как мы программируем логику в Prolog. Логическая программа более формально: набор аксиом или правил, определяющих отношения (ака предикаты) между объектами. Альтернативный способ интерпретации базы данных выше более формальным логическим способом:
Отношение father_child держится между fred и susan
Отношение mother_child относится к холмику и Джо
Для всех X и Y отношение child_of выполняется между X и Y если отношение father_child выполняется между Y и X , или отношение mother_child выполняется между Y и X
Привет, мир
Привет, Мирв интерактивном интерпретаторе
Чтобы напечатать «Привет, мир!» в интерпретаторе Prolog (здесь мы используем swipl , оболочку для SWI Prolog):
$ swipl ?- write(‘Hello, World!’), nl.
?- это системное приглашение: оно указывает, что система готова для пользователя ввести последовательность целей(т.е. запрос), которые должны быть прерваны с помощью . (полная остановка).
Здесь запрос write(‘Hello World!’), nl имеет два цели:
- write(‘Hello World!’) : ‘Hello World!’ должен отображаться и( , )
- должна следовать новая строка ( nl ).
write/1 (символ /1 используется, чтобы указать, что предикат принимает один аргумент), а nl/0 — встроенные предикаты(определение предоставляется заранее системой Prolog). Встроенные предикаты предоставляют средства, которые не могут быть получены с помощью чистого определения Prolog или для сохранения программиста от необходимости определять их.
заканчивается на yes что означает, что запрос преуспел. В некоторых системах вместо « yes печатается true .
Привет, Мириз файла
Откройте новый файл hello_world.pl и вставьте следующий текст:
:- initialization hello_world, halt. hello_world :- write(‘Hello, World!’), nl.
Директива initialization указывает, что цель hello_world, halt следует вызывать, когда файл загружен. halt завершает работу программы.
Затем этот файл можно выполнить с помощью исполняемого файла Prolog. Точные флаги зависят от системы Prolog. Если вы используете SWI Prolog:
$ swipl -q -l hello_world.pl
Это даст результат Hello, World! , Флаг -q подавляет баннер, который обычно отображается, когда вы вызываете run swipl . Параметр -l указывает файл для загрузки.
Источник: learntutorials.net