Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 11
На сайте нет зарегистрированных пользователей

Пользователей: 13,372
новичок: vausoz
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование процесса поступления заявок в систему, состоящую из трёх Э...
Обучающая и тестирующая программа по здаче экзамена ПДД на Turbo Pascal ...
Информационная система - продуктовый магазин на Turbo Pascal (База данны...

8.1. Расположение текстов программ


После того как программист принял решение о том, как представлять и обрабатывать объекты и отношения в программе, ему следует убедиться в том, что текст программы расположен удобно для чтения и ее синтаксические конструкции ясны. Набор утверждений для данного предиката называется процедурой. Возможно, вы уже обратили внимание на то, что в примерах данной книги каждое утверждение в процедуре начинается с новой строки, а между собой процедуры разделяются одной пустой строкой. Например, один из способов определения предиката эквивалентности для множеств (при представлении множеств в виде списков) состоит в использовании трех предикатов, каждый из которых определяется с помощью процедуры из двух строк:
равмнож(Х,Х):-!.
равмнож(Х,Y):- равспис(Х,Y).
равспис([],[]).
равспис([Х|L1],L2):- удалить(Х,L2,LЗ), равспис(L1,LЗ).
удалить(Х,[Х|Y],Y).
удалить(Х,[Y|L1],[Y|L2]):- удалить(Х,L1,L2).



Данный пример, возможно, не является наилучшим определением эквивалентности множеств, однако он показывает, как нужно размещать тексты процедур. Заметим, что утверждения каждой процедуры сгруппированы вместе, а процедуры разделяются пустой строкой. Другое соглашение, которого придерживаются многие программисты на Прологе, - это писать каждое утверждение на отдельной строке, если оно на ней умещается. Если нет, то писать заголовок утверждения и знак ':-' на первой строке, а каждую цель в конъюнкции целей писать с новой строки со сдвигом. Для примера рассмотрим запись программы порождения всех перестановок списка:
перест([],[]).
перест(L,[Н|Т]):-
 присоединить(Y,[Н|U],L),
 присоединить(V,U,W),
 перест(W,T).



В этом определении перестановки элементов списка выполняет предикат присоединить, а механизм возврата при каждой попытке вновь согласовать целевое утверждение перест(Х, Y) обеспечивает порождение из X новой перестановки Y . Следует обратить внимание на способ размещения на странице конъюнктов второго утверждения.
Главное – остановить свой выбор на каком-либо согласованном наборе правил оформления текста программы, а на каком – не так уж важно. Как правило, полезно добавлять комментарии, надлежащим образом группировать термы, в случае сомнений относительно приоритета выполнения операций – использовать круглые скобки, а также разумно распоряжаться пустым пространством (пробелами и пустыми строками). Комментарии должны подсказывать, как следует интерпретировать аргументы структур или утверждений: в каком порядке они поступают и каким структурам данных (константам или структурам) они должны соответствовать. Полезно также указывать в комментариях, как должны конкретизироваться переменные в результате согласования данного утверждения с базой данных.
В плане общей организации программы полезно разделять текст программы на более или менее замкнутые части, например, желательно, чтобы все процедуры обработки списков оказались в одном и том же файле. Процедура Пролога, содержащая более пяти – десяти правил, может оказаться трудной для понимания, поэтому путем определения более мелких предикатов попытайтесь как можно более естественным образом разбить ее на части. Если в программе используется много фактов, таких как правила упрощения из разд. 7.12, то все эти факты должны содержаться в одном файле. Большое количество фактов легче читается, чем большое количество правил, и хотя даже несколько правил могут быть трудны для понимания, многие страницы описания конкретного факта могут не вызвать затруднений, поскольку сама семантика фактов более проста.
Еще один момент, который влияет на легкость чтения Пролог-программ, - это использование точки с запятой («или») и восклицательного знака («отсечение»). С проблемами, связанными с чрезмерно широким использованием «отсечения», мы познакомились в гл. 4. Всегда следует пытаться обойтись без ';', возможно за счет дополнительных утверждений. Например, следующая программа:
nospy(X):-
 проверить(Х,Функтор,ЧисАрг,А), !,
 (контрточка(_,Функтор,А), !,
  (отказ(контрточка(Заголовок, Функтор, ЧисАрг),_),
  устконтрточку(Заголовок, Тело),
  отказ(3аголовок, Тело),
  write('контр.точка с терма'), печтерм(Функтор, ЧисАрг),
  write(' удалена.'),nl,
  fail
   ; true
 )
 ; write('Heт контр.точек на терме'),
  write(X), put(46), nl
),
!.



гораздо труднее для понимания, нежели:
nospy(X):-проверить(Х,Функтор,ЧисАрг,А),!,
попыт_убр(Х,Функтор,ЧисАрг,А).
попыт_убр(_,Функтор, ЧисАрг,А):- контрточка(_,Функтор,А),!,убрконтрточку(Функтор, ЧисАрг, А).
попыт_убр(Х,_,_,_):- write('Heт контр.точек на терме '), write(X), put(46), nl,!.
убрконтрточку(Функтор, ЧисАрг, А):-
 отказ(контрточка(Заголовок,Функтор, ЧисАрг), _), устконтрточку(Заголовок,Тело), отказ(3аголовок, Тело),
 write('Koнтp.точка с терма'), печтерм(Функтор, ЧисАрг), write(' удалена.'), nl, fail.
убрконтрточку (_,_,_).



которая делает в точности то же самое. Если же вам действительно необходимо использовать «или», то полезно так организовать текст конъюнкции целей, чтобы «или» не терялось среди целей. Полезно также заключить соответствующие цели в скобки, чтобы явно выделить область действия этого «или».
На протяжении всей книги подчеркивалась важность умения учитывать при решении многих задач наряду с общим правилом и граничные условия. Всюду, где это возможно, мы старались разместить граничные условия перед всеми другими утверждениями процедуры. Это выделяет граничные условия и, кроме того, служит в какой-то мере защитой от циклических определений. Однако бывают случаи, когда желательно размещать граничные условия после всех утверждений процедуры. Очевидно, что правила-«ловушки», с которыми мы уже сталкивались несколько раз, нужно размещать в конце процедуры.
Разбирая Пролог-процедуру всегда полезно обращать внимание на следующие важнейшие моменты ее записи:
• Проверьте посимвольно, как записано имя каждого предиката и каждой переменной в процедуре. Ошибки в написании имен довольно распространены.
• Проверьте число аргументов каждого функтора, используемого в процедуре. Убедитесь в том, что число аргументов (и порядок их следования) соответствуют вашим проектным решениям.
• Выделите из утверждений все операторы и определите их приоритет, ассоциативность, а также то, где находятся их аргументы. Это можно сделать на основании определений операторов, и исходя из наличия скобок. Если есть сомнения, добавьте дополнительные скобки. Для проверки соответствия действия оператора вашим представлениям попробуйте распечатать некоторые простые термы, используя display.
• Обратите внимание на область определения каждой переменной и выделите в этой области переменные, сходные с ней по имени. Проследите, какие переменные «сцепляются», когда одной из них будет присвоено значение. Проверьте, встречаются ли в теле утверждения переменные из его заголовка.
• Постарайтесь определить, какие переменные конкретизированы, а какие нет в момент перед применением утверждения.
• Выделите утверждения, составляющие граничные условия. Проверьте, учтены ли все возможные граничные условия.
После того как подобным образом процедура будет разобрана «по косточкам», вы поймете ее гораздо лучше.

Опубликовал Kest July 09 2009 21:23:55 · 0 Комментариев · 9690 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Dnavigator
Искусство програм...
Приложение Клиент...
Синтаксический ан...
JanReplace
Java в примерах -...
Усложнённый кальк...
Язык программиров...
База данных фильм...
AlnComponents
Советы от Даниилы...
Report
Пользовательская...
Proeffectimage
Animated Menus
Crypt32
LaserTank [Исходн...
ActiveX в Delphi
Ранги для форума
CoolHints2k

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97839
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14193
Borland Delphi ... 10293
Turbo Pascal fo... 7374
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Программирование: ...
Azino777
Аварийное восстано...
Архитектура ОП дол...
Вычисление чисел Ф...
Одинцово ремонт хо...
Хакинг стандартных...
Букмекер Gorilla
Target address not...
Инструменты раскру...
ОЦЕНКА НОВЫХ ВОЗМО...
Создание объекта E...
Отражайте корпорат...
Организация ввода-...
Небольшие изменени...
Алгоритмы поиска в...
Определение шаблон...
Разработчики
Джет Казино
Web-дизайн
Слоты Gms Deluxe с...
Доставка грузов
Подробно о принцип...
излишними привилег...
Мобильная версия A...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?