Специалист
Сообщений: 8,039
Сказал(а) спасибо: 2
Поблагодарили 324 раз(а) в 323 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

07.07.2005, 16:21
Для изучающих Пролог в среде VIP6.2.
Запускать форумные примеры в среде VIP6.2 проще всего в консольном варианте. Вот краткая справка, как это делать:
1. Создайте проект с UI Strategy = Console
2. После компиляции откройте файл < имя_проекта.pro> и вставьте нужный код вот сюда:
Код:
run():-
console::init(),
<Ваш код>.
3. Опишите Ваши предикаты в разделе: class predicates.
4. Для ввода/вывода используйте упрощённое описание основных предикатов класса Console: - 1) console::classInfo(Name,Version) - возвращает имя и версию класса console (string,string).
2) console::close() - закрыть окно.
3) Title = console::getConsoleTitle() - возвращает имя окна (string).
4) Width = console::getConsoleWidth() - возвращает ширину окна как максимальное число символов в строке.
5) L = console::getLocation() - возвращает текущую позицию (колонка, ряд) курсора. Позиция - это структура: console::location(X,Y).
Пример: console::location(X,Y) = console::getLocation()
6) console::init() - инициализация консоли.
7) console::isModeEcho() - истинен, если включён эховывод в окно.
8 ) console::isModeLine() - истинен, если включён режим ввода строки только по <ВК>
9) console::isModeProcessed() - истинен, если включён режим обработки символов (backspace, tab,
bell, carriage return и linefeed) без помещения их в буфер.
10 ) console::isModeWrap() - истинен, если включён режим переноса строки.
11) console::nl - перевод в начало след. строки.
12) Char = console::readChar() - чтение одного символа.
13) String = console::readLine() - чтение строки.
14) console::setConsoleTitle("Title") - установка имени окна.
15) console::setLocation(console::location(X,Y)) - установка положения курсора для вывода очередного символа.
16) console::setModeEcho(true/false) - установка/запрет режима эховывода.
17) console::setModeLine(true/false) - установка/запрет режима ввода строки только по <ВК>.
18 ) console::setModeProcessed(true/false) - установка/запрет режима обработки символов.
19) console::isModeWrap(true/false) - установка/запрет режима переноса строки.
20) console::write(...) - вывод.
21) console::writef(...) - форматируемый вывод.
Вот фрагмент примера генерации списка длиной в треть символов ширины экрана, и вывод его на экран:
Код:
class predicates
gen_list : (integer, integer_list) procedure (i,o).
clauses
classInfo(className, classVersion).
gen_list(0,[]):-!.
gen_list(N,[N|L]):-gen_list(N-1,L).
run():-
console::init(),
console::setConsoleTitle("My Title"),
Width = console::getConsoleWidth(),
N = Width div 3,
gen_list(N,List),
console::write("Ширина окна = ",Width," символовn"),
console::write("Список = ",List),
console::setLocation(console::location(20,10)) ,
console::write("Для завершения нажмите "Ввод"..."),
_=console::readline().
Примечание:
1. В Vip6.2 поддерживаются списки стандартных доменов, см. пример:
Код:
gen_list : (integer, integer_list) procedure (i,o).
2. В Vip6.2 поддерживается функциональный стиль, см. пример:
Код:
gen_list(N,[N|L]):-gen_list(N-1,L).
|
|
|
Специалист
Сообщений: 8,039
Сказал(а) спасибо: 2
Поблагодарили 324 раз(а) в 323 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

13.07.2005, 21:10
На основании рекомендаций Виктора Анатольевича ( http://www.hardforum.ru/t60108) демонстрирую модифицированный пример консольного приложения. В данном примере используется директива open, что позволяет опускать явное упоминание имени класса console при вызове предикатов из этого класса. Исходник стал выглядеть более лаконично.
Для понимания сути изменений своё предыдущее сообщение не удаляю.
Код:
implement пример
open core
open console
constants
className = "Пример №1".
classVersion = "Версия 2.0".
class predicates
gen_list : (integer, integer_list) procedure (i,o).
clauses
classInfo(className, classVersion).
gen_list(0,[]):-!.
gen_list(N,[N|L]):-gen_list(N-1,L).
run():-
init(),
setConsoleTitle("My Title"),
Width = getConsoleWidth(),
gen_list(Width div 3,List),
write("Ширина окна = ",Width," символовn"),
write("Список = ",List),
setLocation(location(20,10)) ,
write("Для завершения нажмите "Ввод"..."),
_ = readline().
end implement пример
goal
mainExe::run(пример::run).
Примечание:
1. В Vip6.2 поддерживаются списки стандартных доменов, см. пример:
Код:
gen_list : (integer, integer_list) procedure (i,o).
2. В Vip6.2 поддерживается функциональный стиль, см. пример:
Код:
gen_list(N,[N|L]):-gen_list(N-1,L).
или
Код:
gen_list(Width div 3,List),
|
|
|
Новичок
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.08.2005
|

26.08.2005, 05:34
Хотелось бы выразить особую благодарность особенно за первую буквицу ( почти азбука ). Ура создателям(троекратное).
|
|
|
Новичок
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.11.2002
|

21.09.2005, 19:57
Цитата:
Originally posted by Alison
[b]Где взять DjVu? Ссылка не работает
|
Плагин чтения формата DjVu для Internet Explorer можно скачать
с http://radioam.narod.ru/3/djvu/djvuplug.exe
|
|
|
Специалист
Сообщений: 8,039
Сказал(а) спасибо: 2
Поблагодарили 324 раз(а) в 323 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

13.10.2005, 01:20
Преобразование цели из determ/nondeterm/multy в procedure (только для VIP6).
Подавляющее большинство форумных примеров написано для компиляторов от Турбо-Пролога до VIP5 включительно. Однако начиная с VIP6 был изменён режим детерминизма цели, которая теперь должна быть только procedure. Наверное по этой же причине в VIP6 была ликвидирована и волшебная кнопочка "G" для теста произвольного предиката (большая просьба к PDC вернуть волшебную кнопочку).
Поэтому, для запуска форумных примеров в консольном приложении VIP6 надо осуществить небольшое преобразование целевого предиката так, чтобы он стал procedure. Ниже приведены примеры трёх преобразований.
1. multi -> procedure Вот прога, в которой предикат старт() имеет режим детерминизма multi и поэтому прога не запускается:
Код:
implement проба
open core, console
class facts
факт : (integer) nondeterm.
class predicates
старт : (string) multi (o).
clauses
факт(1). факт(2). факт(3).
старт("Да"):- факт(_).
старт("Нет").
run():-init(),
старт(Я),
write(Я),
_=readchar().
end implement проба
goal mainExe::run(проба::run).
Вот как можно преобразовать multy в procedure:
Код:
implement проба
open core, console
class facts
факт : (integer) nondeterm.
class predicates
старт : (string) procedure (o).
clauses
факт(1). факт(2). факт(3).
старт("Да"):- факт(_),!.
старт("Нет").
run():-init(),
старт(Я),
write(Я),
_=readchar().
end implement проба
goal mainExe::run(проба::run).
2. determ -> procedure
Вот прога, в которой предикат старт() имеет режим детерминизма determ и поэтому прога не запускается:
Код:
implement проба
open core, console
class facts
факт : (integer) nondeterm.
class predicates
старт : (string) determ (o).
clauses
факт(1). факт(2). факт(3).
старт("Да"):- факт(_),!.
run():-init(),
старт(Я),
write(Я),
_=readchar().
end implement проба
goal mainExe::run(проба::run).
Вот как можно преобразовать determ в procedure:
Код:
implement проба
open core, console
class facts
факт : (integer) nondeterm.
class predicates
старт : (string) procedure (o).
clauses
факт(1). факт(2). факт(3).
старт("Да"):- факт(_),!.
старт("Значение по умолчанию").
run():-init(),
старт(Я),
write(Я),
_=readchar().
end implement проба
goal mainExe::run(проба::run).
3. nondeterm -> procedure
Вот прога, в которой предикат старт() имеет режим детерминизма nondeterm и поэтому прога не запускается:
Код:
implement проба
open core, console
class facts
факт : (integer) nondeterm.
class predicates
старт : (string) procedure (o).
clauses
факт(1). факт(2). факт(3).
старт("Да"):- факт(_).
run():-init(),
старт(Я),
write(Я),
_=readchar().
end implement проба
goal mainExe::run(проба::run).
Вот как можно преобразовать nondeterm в procedure:
Код:
implement проба
open core, console
class facts
факт : (integer) nondeterm.
class predicates
старт : (string) procedure (o).
clauses
факт(1). факт(2). факт(3).
старт("Да"):- факт(_),!.
старт("Значение по умолчанию").
run():-init(),
старт(Я),
write(Я),
_=readchar().
end implement проба
goal mainExe::run(проба::run).
|
|
|
Member
Сообщений: 1,006
Сказал(а) спасибо: 0
Поблагодарили 48 раз(а) в 48 сообщениях
Регистрация: 10.02.2005
|

02.11.2005, 14:07
Не знаю известно ли посетителям. Раньше была ссылка на учебный курс по Прологу. Теперь мне сообщили, что появилась книжка
http://www.intuit.ru/shop/books/series/it-...html?id=2493382
|
|
|
Member
Сообщений: 4,791
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
|

02.11.2005, 15:57
VictorY, а Вы ее читали? У Вас есть о ней собственное мнение?
|
|
|
Member
Сообщений: 1,006
Сказал(а) спасибо: 0
Поблагодарили 48 раз(а) в 48 сообщениях
Регистрация: 10.02.2005
|

02.11.2005, 16:30
Цитата:
Originally posted by Alison
[b]VictorY, а Вы ее читали? У Вас есть о ней собственное мнение?
|
Нет, не читал. Мне эту ссылку сегодня прислали. Не знаю, есть ли она у нас в магазинах. При случае посмотрю.
|
|
|
Специалист
Сообщений: 8,039
Сказал(а) спасибо: 2
Поблагодарили 324 раз(а) в 323 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

02.11.2005, 18:49
Благодарю за ссылку VictorY.
Мнение выразить трудно не видя книжку, но её содержание:
Цитата:
Лекция 1. Введение в язык логического программирования Пролог
Лекция 2. Логические основы Пролога
Лекция 3. Основные понятия Пролога
Лекция 4. Рекурсия
Лекция 5. Основы Турбо Пролога. Структура программы на Турбо Прологе. Директивы компилятора
Лекция 6. Управление выполнением программы на Прологе
Лекция 7. Списки
Лекция 8. Сортировка списков
Лекция 9. Множества
Лекция 10. Деревья
Лекция 11. Строки
Лекция 12. Файлы
Лекция 13. Внутренние (динамические) базы данных
Лекция 14. Пролог и искусственный интеллект
|
и оно говорит само за себя. Будем ждать её появления на прилавках.
|
|
|
Новичок
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.12.2005
|

24.12.2005, 08:41
Посоветуйте книгу по Прологу (разумеется) по реализации сетей Петрей
и соответственно задачам взаимного исключения, обедающих философах...
|
|
|
Специалист
Сообщений: 8,039
Сказал(а) спасибо: 2
Поблагодарили 324 раз(а) в 323 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

15.02.2006, 18:36
Здравствуйте dimlevnik!
Благодарим за Вашу помощь.
Думаю, что многим людям будет интересно познакомиться с VIP посредством Вашего перевода, т.к. не все владеют английским в достаточной степени.
:-Винитархъ,!.
|
|
|
Специалист
Сообщений: 8,039
Сказал(а) спасибо: 2
Поблагодарили 324 раз(а) в 323 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

07.03.2006, 10:56
Надысь наткнулся на сайт ( http://kid.stu.cn.ua/~shedar/prolog) с GUI-играми, написанными на Прологе:
1. Арканоид.
2. Сапёр.
3. Поддавки в шашки.
4. Морской бой.
5. Тетрис.
6. 3D Крестики-нолики (на поле 3х3х3).
Можно скачать исполнимые файлы и даже попросить по мылу исходники.
Тысяча благодарностей разработчику!
|
|
|
Специалист
Сообщений: 8,039
Сказал(а) спасибо: 2
Поблагодарили 324 раз(а) в 323 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

02.05.2006, 21:21
Новые парадигмы VIP7.
Вашему вниманию предлагаются простые примеры использования новых парадигм VIP7, а именно: - функциональный стиль программирования
разрушающее присваивание (факты-переменные)
цикл foreach
фильтр решений (завершённый findall)
полиморфные предикаты
ветвление if then else
вложенное ИЛИ и скобки
Все приводимые примеры являются консольными приложениями VIP7.
Вычисления факториала.
Способ 1. Функциональный стиль VIP7.
Код:
implement a111
open core, console
class predicates
f : (integer) -> integer Output procedure (i).
clauses
f(0)=1:-!.
f(N)=N*f(N-1).
run():-init(),
write(f(5)),nl,
_=readchar().
end implement a111
goal
mainExe::run(a111::run).
Способ 2. Использование факта-переменной (не факториала ради, а примера для).
Код:
implement a111
open core, console
class facts
x : integer := 1.
class predicates
f : (integer) procedure (i).
clauses
f(0):-!.
f(F):-x:=x*F, f(F-1).
run():- init(),
f(10),
write(x),nl,
_=readchar().
end implement a111
goal
mainExe::run(a111::run).
Пересечение множеств целых чисел, представленных списками.
Способ 1. С помощью встроенного цикла foreach:
Код:
implement a111
open core, console
class predicates
member : (integer,integer*) nondeterm anyflow.
clauses
member(Elem,[Head|Tail]):- Elem = Head; member(Elem,Tail).
run():- init(),
L1 = [1,2,3,4,5,6,7,8,9],
L2 = [1,3,5,7,9,11,13,15],
foreach member(X,L1),member(X,L2) do write(X," ") end foreach,
_=readchar().
end implement a111
goal
mainExe::run(a111::run).
Способ 2. С помощью фильтра решений (завершённого findall):
Код:
implement a111
open core, console
class predicates
member : (integer,integer*) nondeterm anyflow.
clauses
member(Elem,[Head|Tail]):- Elem = Head; member(Elem,Tail).
run():- init(),
L1 = [1,2,3,4,5,6,7,8,9],
L2 = [1,3,5,7,9],
write([X||member(X,L1),member(X,L2)]),
_=readchar().
end implement a111
goal
mainExe::run(a111::run).
Пересечение множеств любых однотипных элементов, представленных списками.
С помощью фильтра решений и полиморфного предиката member():
Код:
implement a111
open core, console
class predicates
member : (Elem, Elem*) nondeterm anyflow.
clauses
member(Elem,[Head|Tail]):- Elem = Head; member(Elem,Tail).
run():- init(),
L1 = [1,2,3,4,5,6,7,8,9],
L2 = [1,3,5,7,9,11,13,15],
write([X||member(X, L1),member(X, L2)]),nl,
L3 = ['a','b','c','d','e','f','g','h','k','l','m','n','o'],
L4 = ['f','x','g','a','d','z'],
write([Y||member(Y, L3),member(Y, L4)]),nl,
_=readchar().
end implement a111
goal
mainExe::run(a111::run).
Сумма квадратов элементов списка.
Функциональный стиль.
Код:
implement a111
open core, console
class predicates
sqlist : (integer*) -> integer Output procedure (i).
clauses
sqlist([])=0:-!.
sqlist([X|L])=X*X+sqlist(L).
run():- init(),
L = [1,8,6,7,9],
write(sqlist(L)),
_=readchar().
end implement a111
goal
mainExe::run(a111::run).
Сумма квадратов ряда 1..n.
Функциональный стиль.
Код:
implement a111
open core, console
class predicates
sumsq : (integer) -> integer Output procedure (i).
clauses
sumsq(1)=1:-!.
sumsq(X)=X*X+sumsq(X-1).
run():- init(),
write(sumsq(5)),
_=readchar().
end implement a111
goal
mainExe::run(a111::run).
Ветвление.
Пример определения чётности числа.
Код:
implement a111
open core, console
clauses
run():- init(),
I=5,
if I mod 2 =0
then write(I," - чёт")
else write(I," - нечёт")
end if,
_=readchar().
end implement a111
goal
mainExe::run(a111::run).
Вложенное ИЛИ.
Пример выборочного суммирования элементов ряда 1..n. Суммируются только те элементы, которые делятся (на 2 или на 3) и (на 4 или на 5).
Код:
implement a111
open core, console
class predicates
sumsq : (integer) -> integer Output procedure (i).
clauses
sumsq(1)=1:-!.
sumsq(X)=X+sumsq(X-1):-(X mod 2 = 0; X mod 3 = 0),
(X mod 4 = 0; X mod 5 = 0),!.
sumsq(X)=sumsq(X-1).
run():- init(),
write(sumsq(6)),
_=readchar().
end implement a111
goal
mainExe::run(a111::run).
|
|
|
Специалист
Сообщений: 8,039
Сказал(а) спасибо: 2
Поблагодарили 324 раз(а) в 323 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

07.05.2006, 21:38
Было несколько вопросов по личке о способах ввода/вывода информации в консольных приложениях Vip6/7. Отвечаю.
Способы ввода/вывода информации в консоле Vip6/7.
Отличием Vip6/7 от прежних версий является непосредственное использование буфера ввода/вывода.
1) Способ ввода/вывода символов.
При чтении символов (char) необходимо помнить, что чтение осуществляется после нажатия "Enter" (если только Вы не изменили режим обработки управляющих символов предикатом setModeProcessed(false())). Поэтому, даже если Вы напечатали несколько символов, предикат readchar() прочтёт только первый символ.
Предикат readchar() в Vip6/7 завершает работу только после нажатия "Enter" и не очищает "за собой" буфер. Поэтому после чтения одного или нескольких символов необходимо принудительно очищать буфер ввода с помощью предиката clearInput(), например:
Код:
Char=readchar(), clearInput(),
Если это не делать, то следующий предикат чтения будет читать из буфера оставшуюся информацию. С точки зрения наблюдателя будет казаться, что следующие предикаты чтения "не работают". Однако это не так. Просто программа отработав задание закроет окно консоли.
ВАЖНО!!! Клавиша "Enter" рассматриватся предикатом readchar() как обыкновенный символ (если только Вы не изменили режим обработки управляющих символов предикатом setModeProcessed(false())).
Вот пример, показывающий "автоматическое" срабатывание предиката readline() по причине того, что символ "Enter" не удалён из буфера после чтения символа предикатом readchar():
Код:
run():-
init(),
Char=readchar(),
%clearInput(),
write(Char),
_=readline().
Если раскомментировать clearInput(), то прога будет работать так, как ожидает пользователь Vip5 и более ранних версий. Можно использовать clearInput() непосредственно перед завершающим предикатом _=readline().
Следующий пример показывает как можно прочитать один символ (независимо от того, сколько их было напечатано до нажатия на клавишу "Enter") и получить из него другой символ. После нажатия на клавишу "Enter" нижеприведённая программа очищает буфер, получает символ, код которого на 10 больше, и печатает эту пару символов через стрелку. Для получения эффекта "press Enter" в этом примере используется предикат подавления эхо-вывода setModeEcho(false()) и собственно предикат ожидания клавиши "Enter" - readline().
Код:
run():-
init(),
Char=readchar(),
clearInput(),
Char1=getCharFromValue(getCharValue(Char)+10),
write(Char," -> ",Char1),
setModeEcho(false()),
_=readline().
Следующий пример демонстрирует чтение первых трёх символов, и вывод их кодов через стрелку. Если Вы ввели меньше трёх символов, то программа будет ожидать ввода остальных недостающих символов. Замечу, что нажатие на клавишу "Enter" это тоже символ, имеющий свой собственный код, поэтому можно просто нажать три раза "Enter" и посмотреть результат.
Код:
run():-
init(),
Char1=readchar(),
Char2=readchar(),
Char3=readchar(),
write(getCharValue(Char1)," -> ",getCharValue(Char2)," -> ",getCharValue(Char3)),
setModeEcho(false()),
clearInput(),
_=readline().
2) Способ ввода/вывода строк.
Чтение строки осуществляется предикатом readline(). Этот предикат читает всю строку вместе с символом "Enter", поэтому буфер очищать "за ним" не надо. Следующий пример демонстрирует чтение двух разных строк, т.к. после ввода первой строки буфер очищается автоматически.
Код:
run():-
init(),
X=readline(),
Y=readline(),
write(X,"->",Y),
setModeEcho(false()),
_=readline().
3) Способ ввода/вывода целых чисел.
Предикат read() читает терм. Поэтому использовать clearInput() при вводе последовательности целых чисел не обязательно. По умолчанию предикат read() может работать с целыми числами (integer, unsigned). Перед завершающим предикатом _=readline() всё равно необходимо использовать clearInput().
Код:
run():-
init(),
X=read(),
Y=read(),
write(X,"+",Y,"=",X+Y),
setModeEcho(false()),
clearInput(),
_=readline().
4) Способ ввода/вывода вещественных чисел.
Для ввода вещественных чисел необходимо для вводимой переменной указывать домен real, который будет ожидать предикат read().
Код:
run():-
init(),
hasDomain(real,X),
X=read(),
Y=read(),
write(X,"+",Y,"=",X+Y),
setModeEcho(false()),
clearInput(),
_=readline().
5) Способ ввода/вывода термов (структур).
Для ввода термов (структур) необходимо в предикате hasDomain(myDom,X) указать ожидаемый при вводе домен для каждой переменной.
Код:
implement a111
open core, console
domains
myDom = i(integer);r(real).
class predicates
печать : (myDom) procedure (i).
clauses
печать(i(X)):-write("nЦелое: ",X),!.
печать(r(X)):-write("nВещественное: ",X).
run():-
init(),
hasDomain(myDom,X),
X=read(),
hasDomain(myDom,Y),
Y=read(),
печать(X),
печать(Y),
setModeEcho(false()),
clearInput(),
_=readline().
end implement a111
goal
mainExe::run(a111::run).
|
|
|
Опции темы |
|
Опции просмотра |
Линейный вид
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
|