Member
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.10.2010
|
Перенос программ из {TurboProlog.....Visual Prolog 5.2} в Visual Prolog 7 -
27.10.2010, 12:22
Добрый день,
помогите, пожалуйста, с VIP 7.1, никогда с ним не работала.
В VIP 5.2, помнится, можно было запустить программу на Турбопрологе без каких-либо переделок. Как это сделать в 7.1?
Заранее благодарна за любую помощь)
Цитата:
Jenny_, если по хорошему, то Вам следовало бы создать новую тему для своего вопроса, так как эта темя про книги по Visual Prolog. Поэтому отвечу кратко - надо изменять синтаксис всех разделов турбо-программы. Детальнее отвечу в теме, которую Вы, по моему настоятельному совету, всё же создадите сами и приведёте исходник проги (если он не слишком велик).
|
Давайте разделим проги на 3 группы.
1. Без стандартных турбопрологовских предикатов чтения readln, readint, readreal, readterm. И без использования динамических баз данных.
2. С вводом данных с клавиатуры, без ДБД.
3. С использованием стандартных предикатов для работы с ДБД.
Вот, например, прога, использующая readint
[PROLOG]
domains
list=integer*
predicates
readlist(list)
sum1(list,integer,integer,integer,integer)
result
goal
result.
clauses
result:-
readlist(L),
sum1(L,0,S1,0,C1),write("Summa1="),write(S1),nl,
write("Count1="),write(C1),nl.
readlist([H|T]):- readint(H),readlist(T).
readlist([]).
sum1([],S,S,C,C):-!.
sum1([X|T],S1,S,C1,C):-
S2=S1+X,
C2=C1+1,
sum1(T,S2,S,C2,C).
[/PROLOG]
|
|
|
Специалист
Сообщений: 8,020
Сказал(а) спасибо: 2
Поблагодарили 317 раз(а) в 317 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

27.10.2010, 18:01
Для переноса программ из версий {TurboProlog, ... ,Visual Prolog 5.2} в Visual Prolog 7 необходимо:
1) Создать в среде Visual Prolog 7 консольное приложение.
2) Исходник до первой компиляции Вы конечно не увидете, поэтому сразу надо скомпилить (или запустить на выполнение). После этого в браузере проекта увидите дерево файлов среди которых будет файл с расширением main.pro. Вот его родного Вы и откройте двойным щелчком.
3) В отдельном окне Вы и увидите код. Прошу не пугаться разительныими отличиями от старого синтаксиса - они не такие кардинальные, как на первый взгляд может показаться.
Цитата:
Сообщение от Visual Prolog 7
implement main
open core
constants
className = "main".
classVersion = "".
clauses
classInfo(className, classVersion).
clauses
run():-
console::init(),
succeed(). % place your own code here
end implement main
goal
mainExe::run(main::run).
|
4) Первое отличие касается объявления предикатов. Теперь между именем предиката и его аргументами надо ставить двоеточие, а после аргументов указывать режим детерминизма и направление потока аргументов для каждой переменной (входной или выходной или любой).
5) Второе отличие - роль раздела goal сейчас играет предикат run(), расположенный в конце исходника.
6) У Вас в проге я добавил условие выхода из цикла ввода списка целых чисел - этим условием является ввод цифры ноль. Подправив как надо получаем работающий исходник Вашей проги:
Цитата:
Сообщение от Visual Prolog 7
implement main
open core, console
constants
className = "main".
classVersion = "".
class predicates
readlist: (integer*) procedure (o).
sum1: (integer*,integer,integer,integer,integer) procedure (i,i,o,i,o).
result:().
clauses
classInfo(className, classVersion).
result():-
readlist(L),
sum1(L,0,S1,0,C1),write("Summa1="),write(S1),nl,
write("Count1="),write(C1),nl.
readlist([H|T]):- H=read(),H<>0,!,readlist(T).
readlist([]).
sum1([X|T],S1,S,C1,C):-
S2=S1+X,
C2=C1+1,!,
sum1(T,S2,S,C2,C).
sum1([],S,S,C,C).
run():-
console::init(),
result(),
clearInput(),
_=readchar().
end implement main
goal
mainExe::run(main::run).
|
|
|
|
Специалист
Сообщений: 8,020
Сказал(а) спасибо: 2
Поблагодарили 317 раз(а) в 317 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

27.10.2010, 18:08
7) Обратите внимание на отсутствие объявления списка целых чисел в разделе доменов. Хотя можно было и оставть старое объявление.
8) Далее можно слегка модифицировать исходник сохранив функциональность благодаря возможности использовать функциональный стиль и русский язык:
Цитата:
Сообщение от Visual Prolog 7
implement main
open core, console
constants
className = "main".
classVersion = "".
class predicates
ввод_списка: (integer*) procedure (o).
sum1: (integer*,integer,integer,integer,integer) procedure (i,i,o,i,o).
result:().
clauses
classInfo(className, classVersion).
result():-
ввод_списка(L),
sum1(L,0,S1,0,C1),write("Summa1="),write(S1),nl,
write("Count1="),write(C1),nl.
ввод_списка([H|T]):- H=read(),H<>0,!,ввод_списка(T).
ввод_списка([]).
sum1([X|T],S1,S,C1,C):-!,sum1(T,S1+X,S,C1+1,C).
sum1([],S,S,C,C).
run():-
console::init(),
result(),
clearInput(),
_=readchar().
end implement main
goal
mainExe::run(main::run).
|
|
|
|
Member
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.10.2010
|

27.10.2010, 18:16
Винитарх, огромное спасибо за столь подробный и обстоятельный ответ!
Можно по шагам?
1. Открыла свежескачанный VIP 7.1... Предлагает новый проект создать.
Как создать консольное приложение?
|
|
|
Специалист
Сообщений: 8,020
Сказал(а) спасибо: 2
Поблагодарили 317 раз(а) в 317 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

27.10.2010, 18:20
Да я уж вроде по шагам и описал.
А создать просто - пункт меню project -> new. А там уже указать console.
|
|
|
Member
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.10.2010
|

27.10.2010, 18:28
Огромное спасибо за столь подробный и обстоятельный ответ!
ЗЫ. Хотела повысить вам рейтинг, но, похоже, у вас на форуме не тешатся подобными бирюльками)))
ЗЗЫ. Не сразу выбор консоли заметила...
|
|
|
Member
Сообщений: 991
Сказал(а) спасибо: 0
Поблагодарили 44 раз(а) в 44 сообщениях
Регистрация: 10.02.2005
|

27.10.2010, 19:01
Цитата:
Сообщение от Jenny_
Винитарх, огромное спасибо за столь подробный и обстоятельный ответ!
Можно по шагам?
1. Открыла свежескачанный VIP 7.1... Предлагает новый проект создать.
Как создать консольное приложение?
|
Нуу... свежескачанный должен быть VIP7.3. Значит у Вас не свежескачанный или скачанный из неправильного места ( здесь надо брать).
|
|
|
Специалист
Сообщений: 8,020
Сказал(а) спасибо: 2
Поблагодарили 317 раз(а) в 317 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

27.10.2010, 19:09
+1
Пишу девушке помощь в VIP7.3, а сам думаю, что у неё в 7.1 может чего и не пойти (имена файлов другие, некоторые домены и PFC-предикаты тоже другие).
|
|
|
Member
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.10.2010
|

27.10.2010, 20:56
Не идёт, увы. Говорит, что write не знает
Создаёт вот это, без класса предикатов и run другой.
[PROLOG]implement main
open core
constants
className = "main".
classVersion = "".
clauses
classInfo(className, classVersion).
clauses
run():-
console::init(),
succeed(). % place your own code here
end implement main
goal
mainExe::run(main::run).[/PROLOG]
|
|
|
Специалист
Сообщений: 8,020
Сказал(а) спасибо: 2
Поблагодарили 317 раз(а) в 317 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

27.10.2010, 23:59
Цитата:
Сообщение от enny_
Создаёт вот это, без класса предикатов
|
Jenny_, Вы сами ручками должны дописать то, что я Вам здесь показал и удалить то, что не нужно, например, раздел доменов. То, что run другой - не беспокойтесь, пусть будет другой, но его тело должно быть таким, как я написал.
Приведите прогу, которая у Вас не идёт. В той, что Вы привели предиката write() я не наблюдаю.
|
|
|
Member
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.10.2010
|

28.10.2010, 00:08
Ясен пень дописывала), и с вашим run'ом и с тем. Щас.
|
|
|
Member
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.10.2010
|

28.10.2010, 00:14
Программа у меня незарегистрированная
/************************************************** ***************************
Unregistered
************************************************** ****************************/
implement main
open core
constants
className = "main".
classVersion = "".
class predicates
readlist: (integer*) procedure (o).
sum1: (integer*,integer,integer,integer,integer) procedure (i,i,o,i,o).
result:().
clauses
classInfo(className, classVersion).
clauses
run():-
console::init(),result(),
succeed(). % place your own code here
result():-
readlist(L),
sum1(L,0,S1,0,C1),write("Summa1="),write(S1),nl,
write("Count1="),write(C1),nl.
readlist([H|T]):- H=read(),H<>0,!,readlist(T).
readlist([]).
sum1([X|T],S1,S,C1,C):-
S2=S1+X,
C2=C1+1,!,
sum1(T,S2,S,C2,C).
sum1([],S,S,C,C).
end implement main
goal
mainExe::run(main::run).
|
|
|
Специалист
Сообщений: 8,020
Сказал(а) спасибо: 2
Поблагодарили 317 раз(а) в 317 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

28.10.2010, 00:20
Ошибка у Вас по невнимательности. Я ж открыл класс console, а Вы этого не повторили ни ручками, ни даже просто не скопировали:
open core, console
И почему Вы не завершили цель вот этим, как у меня:
clearInput(),
_=readchar().
|
|
|
Member
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.10.2010
|

28.10.2010, 00:34
Спасибо, компиляция прошла.
Но когда запускаю на выполнение, получаю ошибку, что нет файла
Obj\Visual Prolog.res
|
|
|
Специалист
Сообщений: 8,020
Сказал(а) спасибо: 2
Поблагодарили 317 раз(а) в 317 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

28.10.2010, 00:40
Ну не знаю. Попробуйте откомпилировать проект заново: Build - ReBuildAll
А вообще-то у Вас запускалась изначальная пустая прога, т.е. та, в которой Вы ещё не вносили изменения?
|
|
|
Опции темы |
|
Опции просмотра |
Линейный вид
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
|