Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Visual Prolog 7.3 - Ликбез
Ответ
 
Опции темы Опции просмотра
  (#16 (permalink)) Старый
luetick luetick вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.12.2011
Адрес: Черноморский
По умолчанию 11.01.2012, 00:16

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Но режимы детерминизма я покажу. Однако, если кому-то надо пояснить суть предикатов, сопоставления с образцом и бактрекинга, я готов.
мне, пожалуйста, покажите
Ответить с цитированием
  (#17 (permalink)) Старый
luetick luetick вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.12.2011
Адрес: Черноморский
По умолчанию 11.01.2012, 00:24

Цитата:
Сообщение от Винитарх Посмотреть сообщение
[B]
Visual Prolog Код:
constants
    className = "main".
    classVersion = "$JustDate:  $$Revision:  $".
а почему у меня в classVersion просто пустые кавычки ( = " ") ? Это что-то значит?
Ответить с цитированием
  (#18 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,906
Сказал(а) спасибо: 2
Поблагодарили 297 раз(а) в 297 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 11.01.2012, 00:25

Цитата:
Сообщение от luetick Посмотреть сообщение
мне, пожалуйста, покажите
Вооо.
Хорошооо. Лёд тронулся.
Завтра.
Ответить с цитированием
  (#19 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,906
Сказал(а) спасибо: 2
Поблагодарили 297 раз(а) в 297 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 11.01.2012, 00:30

Цитата:
Сообщение от Винитарх Посмотреть сообщение
а почему у меня в classVersion просто пустые кавычки ( = " ") ? Это что-то значит?
Это константа, она генерится VIP-ом. Она означает дату и номер версии класса main. Почему у Вас эта константа равно пустой строке я не знаю. Может быть потому, что у Вас версия бесплатная (For education purpose), а у меня лицензтонная. В любом случае значение константы ничего не значит. Лично я эти константы убиваю, нафиг они нужны в простых или учебных проектах, которые делает один человек, а не группа.
Ответить с цитированием
  (#20 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,906
Сказал(а) спасибо: 2
Поблагодарили 297 раз(а) в 297 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 12.01.2012, 01:22

Режимы детерминизма предикатов:
erroneous - вызывает исключительную ситуацию. Используется для инициализации переменных или объектов (если это надо).
failure - всегда неуспешен и, следовательно, даёт откат назад. Пример - стандартный предикат fail.
procedure - всегда успешен, даёт только одно решение и, как следствие, не вталкивает в стек вызовов адрес возврата. Пример - предикатs minPredicate и minFunction, при любых исходных данных (правильного типа) всегда вернут только одно решение.
determ - или успешен и тогда даёт только одно решение, или неуспешен и тогда даёт откат назад. Пример - попытка вычисления дискриминанта квадратного уравнения:
Visual Prolog Код:
дискриминант(A,B,C,D) :- Q=B*B-4*A*C, Q>0, D=math::sqrt(math::abs(Q)).
multi - всегда успешен и даёт множество решений. Всешда гадит в стек вызовов. Пример - предикат repeat, который всегда успешен при любом числе откатов назад:
Visual Prolog Код:
repeat.
repeat:-repeat.
Другой пример - генератор бесконечного (в пределах заданного типа данных) ряда чисел с заданным шагом:
Visual Prolog Код:
ряд(A,_,A).
ряд(A,Step,N1) :- N=A+Step, ряд(N,Step,N1).
Третий пример - окрестность точки:
Visual Prolog Код:
окрестность(N) = N+1.
окрестность(N) = N.
окрестность(N) = N-1.
или оно же так:
Visual Prolog Код:
окрестность(N)=М :- M=N+1; M=N; M=N-1.
nondeterm - похож на multi, т.е. имеет множество решений, но ещё может быть и неуспешен и, следовательно, даёт откат назад. Пример - ряд чисел от А до В, но при условии А<=В:
Visual Prolog Код:
between(A,B)=A :- A<=B.
between(A,B)=between(A+1,B) :- A<B.
Другой пример - свойство двух чисел (целое от деления равно остатку от деления, делим первое на второе число или второе на первое):
Visual Prolog Код:
свойство(N,M) :- N div M = N mod M; M div N = M mod N.
Как видите, режим проявялет себя при откате. Процедуру откат не замечает и перепрыгивает её. Мульти откат крутит столько раз, сколько решений у мульти. А потом всё равно откат уходит назад, дальше. Ну а предикаты детерм/нондетерм или сразу сдаются и вызывают откат, или один_раз/несколько_раз дадут решения и потом всё равно откат уходит назад, дальше.

Лично я не парюсь при определении режимов и если ошибаюсь или вообще не указываю, то мне от этого не холодно и не жарко. Режим по умолчанию - процедура. При первой компиляции VIP проводит глобальный анализ потока данных программы и сам определяет правильные режимы и пишет об этом в окне ошибок компиляции. Остаётся только воспользоваться его советом и вписать правильные режимы.

Вот прога, аккумулирующая рассмотренные режимы:
Visual Prolog Код:
implement main
    open core, console

constants
    className = "main".
    classVersion = "$JustDate:  $$Revision:  $".

class predicates
дискриминант: (real,real,real,math::ureal) determ (i,i,i,o).
ряд: (unsigned,unsigned,unsigned) multi (i,i,o).
окрестность: (integer) -> integer multi.
between: (integer,integer) -> integer nondeterm.
свойство: (integer,integer) nondeterm.

clauses
classInfo(className, classVersion).
 
дискриминант(A,B,C,D) :- Q=B*B-4*A*C, Q>0, D=math::sqrt(math::abs(Q)).
%дискриминант(A,B,C,math::sqrt(math::abs(Q))) :- Q=B*B-4*A*C, Q>0.  <- это то же самое, только без лишней переменной

ряд(A,_,A).
ряд(A,Step,N) :- ряд(A+Step,Step,N).

%окрестность(N) = N+1.
%окрестность(N) = N.       <- это первый вариант окрестности.
%окрестность(N) = N-1.
окрестность(N)=M :- M=N+1; M=N; M=N-1.

between(A,B)=A :- A<=B.
between(A,B)=between(A+1,B) :- A<B.

свойство(N,M) :- N div M = N mod M; M div N = M mod N.

clauses
    run():-init(),
       
        if дискриминант(2,9,1,D) then write(D),nl else write("Комплексные корни"),nl end if,
        (дискриминант(2,9,1,D1),write(D1),nl,!; write("Комплексные корни"),nl),  % это проложный аналог if then else
       
        (свойство(3,2),write("Признак есть\n"),!; write("Признака нет\n")),
       
       (write(окрестность(6),"  "),fail; nl),
       
       (write(between(80,90),"  "),fail;nl),
       
       (write("давим Enter\n"), ряд(0,4,N),write(N),_=readline(),fail; succeed),
       
        console::clearInput(),
        _=readline().
end implement main

goal
    mainExe::run(main::run).
На следующий раз осталось по режимам детерминизма:
1) как режимы детерминизма зависят от потока параметров
2) режимы детерминизма фактов
Ответить с цитированием
Ads.
  (#21 (permalink)) Старый
gromozeka gromozeka вне форума
Флудер
 
Аватар для gromozeka
 
Сообщений: 3,169
Сказал(а) спасибо: 6
Поблагодарили 16 раз(а) в 15 сообщениях
Регистрация: 28.02.2005
Адрес: Израиль
По умолчанию 12.01.2012, 02:34

Хм. Если он такой умный и после компиляции может грамотно посоветовать, почему товарищам не сделать в IDE кнопочку, что-нибудь вроде "рекомендуемые режимы детерминизма", нажал - она это всё вставила в шапку, а потом, если что всегда можно ручками поправить . Вообще заметил, что хорошие IDE современных, относительно многословных языков (Java, C#) довольно большое кол-во кода генерируют сами или же активно помогают программисту писать код при помощи всяких умных автодополнений.
Ответить с цитированием
  (#22 (permalink)) Старый
aag aag вне форума
А.А.Г.
 
Аватар для aag
 
Сообщений: 3,380
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
Адрес: Адмиралтейская)))
По умолчанию 12.01.2012, 14:12

Цитата:
Сообщение от gromozeka Посмотреть сообщение
Хм. Если он такой умный и после компиляции может грамотно посоветовать
Он не советует. Он сообщает о некотором несоответствии между заявленным и реализованным.


Visual Prolog Код:
class predicates
member:(integer,integer*) determ.
clauses
member(A,[A|_]).
member(A,[_|B]):- member(A,B).
И где ошибка?
Толи вместо determ надо nondeterm (o,i). (nondeterm(i,i)))))))))
Толи просто не хватает восклицательного знака member(A,[A|_]):- !.


импортирован с progz.ru

Последний раз редактировалось aag; 12.01.2012 в 14:24
Ответить с цитированием
  (#23 (permalink)) Старый
gromozeka gromozeka вне форума
Флудер
 
Аватар для gromozeka
 
Сообщений: 3,169
Сказал(а) спасибо: 6
Поблагодарили 16 раз(а) в 15 сообщениях
Регистрация: 28.02.2005
Адрес: Израиль
По умолчанию 12.01.2012, 14:38

Полагать надо, что код пользователя написан правильно и исходя из этого советовать режим. Впрочем, безусловно, без этого можно обойтись. Я просто насмотрелся позавчера на разработку на шарпе. Скорость почти как у меня на Питоне, при том что кода сильно больше, просто часть этого кода пишет умный IDE.
Ответить с цитированием
  (#24 (permalink)) Старый
aag aag вне форума
А.А.Г.
 
Аватар для aag
 
Сообщений: 3,380
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
Адрес: Адмиралтейская)))
По умолчанию 12.01.2012, 14:59

Цитата:
Сообщение от gromozeka Посмотреть сообщение
Полагать надо, что код пользователя написан правильно и исходя из этого советовать режим.
Объявления режима - тоже код, написанный пользователем.
Окна лепить умная хрень много чего там пишет, вроде(я туда ещё не совался)))


импортирован с progz.ru
Ответить с цитированием
Ads
  (#25 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,255
Сказал(а) спасибо: 27
Поблагодарили 51 раз(а) в 51 сообщениях
Регистрация: 16.10.2005
По умолчанию 12.01.2012, 16:41

Цитата:
Сообщение от aag Посмотреть сообщение
Толи просто не хватает восклицательного знака member(A,[A|_]):- !.
Мои наблюдения показывают, что для determ нужно ставить отсечения
Ответить с цитированием
  (#26 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,906
Сказал(а) спасибо: 2
Поблагодарили 297 раз(а) в 297 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 12.01.2012, 19:44

Цитата:
Сообщение от gromozeka Посмотреть сообщение
Если он такой умный и после компиляции может грамотно посоветовать, почему товарищам не сделать в IDE кнопочку, что-нибудь вроде "рекомендуемые режимы детерминизма", нажал - она это всё вставила в шапку, а потом, если что всегда можно ручками поправить
+1.
Я об этом говорил, давно, не помню когда, ещё для VIP5.2.
Я даже по нескольким классам писал и публиковал на visual-prolog-сайте свои исправления и дополнения, чтобы классы были эффективней и функциональней (console, list, workFreqBook). Но политика PDC такова, что они сами вносят изменения тогда и так, когда и как им это надо. Поэтому я бросил забеги впереди паровоза. Хотя одна насущная задача есть - сделать класс array на основе класса binary. Тем более, что для этого уже появились в VIP 7.3 дженерики (аргументы-домены) и на их основе массивы можно сделать полиморфными, т.е. передавать в класс array тип данных из которых состоит массив.
Цитата:
Сообщение от aag Посмотреть сообщение
И где ошибка?
Толи вместо determ надо nondeterm (o,i).
Ошибка в декларации режима детерминизма. Считается, что пользователь написал такой код, какой ему нужен.
Цитата:
Сообщение от gromozeka Посмотреть сообщение
Полагать надо, что код пользователя написан правильно и исходя из этого советовать режим. Впрочем, безусловно, без этого можно обойтись. Я просто насмотрелся позавчера на разработку на шарпе. Скорость почти как у меня на Питоне, при том что кода сильно больше, просто часть этого кода пишет умный IDE.
1. Не "советовать", а принудительно ставить, причём декларации можно делать автоматически, сохранять где-нить (например, в автоматически генерируемом разделе объявлений имплементации класса, или в файле до которого никому нет дела, кроме въедливых и не вставлять в исходник имплементации). Таким образом язык останется строго типизированным, но со спрятанной от олигофренов явной типизацией. Вообще то это всё лежит на поверхности и разработчики всё это видят и понимают, но с их колокольни взгляд на эти вещи другой.
2. IDE для VIP разрабатывают полтора-два человека из Питера в отличие от тысяч программистов из мелкомягкой корпорации => у PDC просто руки не доходят до этого, тем более, что VIP позиционируется как язык для внутренней разработки проектов PDC, и продажи VIP составляют мизерную часть доходов компании PDC.
Ответить с цитированием
  (#27 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 12.01.2012, 20:23

Цитата:
Сообщение от Винитарх Посмотреть сообщение
1. Не "советовать", а принудительно ставить, причём декларации можно делать автоматически, сохранять где-нить (например, в автоматически генерируемом разделе объявлений имплементации класса, или в файле до которого никому нет дела, кроме въедливых и не вставлять в исходник имплементации). Таким образом язык останется строго типизированным, но со спрятанной от олигофренов явной типизацией. Вообще то это всё лежит на поверхности и разработчики всё это видят и понимают, но с их колокольни взгляд на эти вещи другой.
Не думаю, что это хорошо.
Часто люди могут правильно объявить - это проще, если знать, чего хотеть - но не правильно определить. Тогда нужно менять определение, а не объявление.
В общем, отделение объявления от определения - это дополнительная возможность подумать о том, что надо сделать (а с "думанием" в наше время напряженка у народу, студенческого например).
Ответить с цитированием
  (#28 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,906
Сказал(а) спасибо: 2
Поблагодарили 297 раз(а) в 297 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 12.01.2012, 20:39

Цитата:
Сообщение от Alison Посмотреть сообщение
Часто люди могут правильно объявить - это проще, если знать, чего хотеть - но не правильно определить. Тогда нужно менять определение, а не объявление.
Люди пишут на ISO-Прологах вообще без деклараций. Декларация НИКАК не влияет на замысел программиста. Программист свой замысел реализует в коде.
Я вообще не уверен, что кто-то пишет предикаты начиная с объявления режима детерминизма и потоков параметров, а не с клозов. Это нонсенс.
Alison, я не конфронтую с тобой, это на самом деле мои откровенные и наивные мысли.
Ответить с цитированием
  (#29 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,906
Сказал(а) спасибо: 2
Поблагодарили 297 раз(а) в 297 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 12.01.2012, 20:41

Цитата:
Сообщение от Alison Посмотреть сообщение
В общем, отделение объявления от определения - это дополнительная возможность подумать о том, что надо сделать
Это что, на нетипизированных языках или на языках с динамической типизацией (там нет ручных деклараций) люди мало думают о том, что надо сделать?
Ответить с цитированием
  (#30 (permalink)) Старый
aag aag вне форума
А.А.Г.
 
Аватар для aag
 
Сообщений: 3,380
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
Адрес: Адмиралтейская)))
По умолчанию 12.01.2012, 23:42

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Ошибка в декларации режима детерминизма. Считается, что пользователь написал такой код, какой ему нужен.
Я против. Я считаю, что я сам в состоянии решить, где я допустил ошибку. Режим "оповещения о несоответствии" мне предпочтительнее, чем "папа-компилятор определил, где я ошибся"...
Как-то так...


Цитата:
Сообщение от Винитарх Посмотреть сообщение
Это что, на нетипизированных языках или на языках с динамической типизацией (там нет ручных деклараций) люди мало думают о том, что надо сделать?
К сожалению, большинство людей сегодня вааще и не пытаются думать. И чего там внутри происходит. И как оно работает.

Меня при знакомстве с ВИПом малость кумарила эта необходимость уведомлять.

Щас думаю, что эта необходимость дисциплинирует (Alison сие несколько инача сформулировала, кажется).


В любом случае, давайте ка ЛИКБЕЗ по ВИПу. По такому, какой он есть)))


импортирован с progz.ru
Ответить с цитированием
Ответ

Метки
education free , visual prolog , бесплатное обучение , курсы по prolog , ликбез

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перенос программ из {TurboProlog.....Visual Prolog 5.2} в Visual Prolog 7 imported_Jenny_ Prolog 30 25.03.2013 19:15
visual prolog 5.2 kamikadze0 Prolog 0 08.09.2011 15:11
код из turbo prolog в visual prolog posleg Prolog 4 13.06.2011 00:33
Экспертная система на pdc prolog или visual prolog Anton7 Prolog 8 12.05.2011 13:39
ликбез для следователя tvshow Любые вопросы от новичков 13 19.04.2011 18:11
Помогите переделать задачу из Turbo Prolog в Visual Prolog 5 imported_Anneta Prolog 3 23.12.2010 22:59
Visual Prolog MarGo&#33; Prolog 0 03.05.2010 14:54
Visual Prolog <--> ISO-Prolog z556 Prolog 33 25.12.2009 09:55
Кто возьмется переписать маленькую программу с Turbo Prolog на Visual Prolog 5.0 (за плату) olik567 Prolog 4 07.10.2009 17:46
Кто возьмется переписать маленькую программу с Turbo Prolog на Visual Prolog 5.0 (за плату) Игоревна Задания за деньги 16 04.01.2008 17:20
Нет PIE в Visual Prolog 7.1 PE! Alison Prolog 4 23.08.2007 22:20
Visual Prolog 7.0 help! sherlock2003 Prolog 31 05.01.2007 22:25



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов