Обращение к базе данных происходит так же, как к обычным предикатам, состоящим только из предложений-фактов.
При запуске Пролог-программы интерпретатор определяет, существует ли файл базы данных на диске. Если файл базы данных существует, то он открывается и проверяется соответствие структуры файла базы данных и описания этой базы данных в программе. При описании базы данных в программе некоторые поля можно не использовать. Если файл базы данных отсутствует на диске, то он создается по описанию структуры. При завершении выполнения Пролог-программы все базы данных автоматически закрываются.
Все стандартные предикаты выполняются только прямом пути алгоритма бэктрекинга. На обратном пути они ничего не делают.
Предикаты ввода с консоли.
ReadString(<свободная переменная>) - читает с консоли строку. В качестве параметра обязательно должна передаваться свободная переменная. В противном случае будет выдано сообщение об ошибке и программа закончит свою работу.
ReadInteger(<свободная переменная>) - читает с консоли целое число.
ReadReal(<свободная переменная>) - читает с консоли реальное число.
Предикаты вывода на консоль.
Write (<переменная или константа любого типа>, ...) - печать на консоль содержание переменной. Количество аргументов у предиката произвольно. Количество аргументов у предиката произвольно. Стиль вывода на печать устанавливается в опциях проекта. Например, в процессе отладки можно включить печать имен переменных вместе с их содержимым или кавычки у строковых переменных.
WriteLn (<переменная или константа любого типа>, ...) - печать на консоль содержание переменной или константы и перевод курсора на следующую строку. Количество аргументов у предиката произвольно.
Nl - перевод курсора консоли на следующую строку.
Предикаты определения типов переменных.
IsInteger(<переменная>) - предикат является истинным, если поступающая на вход переменная - целочисленная.
IsReal(<переменная>) - проверяет, является ли переменная реальным числом.
IsNumeric(<переменная>) - проверяет, является ли переменная числовой, то есть либо реальной, либо целой. Использование функции IsNumeric предпочтительнее, чем IsInteger и IsReal, так как в ходе некоторых арифметических операций над целыми числами результат получается дробным (например, при делении).
IsString(<переменная>) - проверяет, является ли переменная строкой.
IsBoolean(<переменная>) - проверяет, является ли переменная логической.
IsList(<переменная>) - проверяет, является ли переменная списком.
IsStruct(<переменная>) - проверяет, является ли переменная структурой.
IsFree(<переменная>) - проверяет, является ли переменная свободной.
Предикаты для работы с базами данных.
Предикаты открытия, закрытия и создания баз данных отсутствуют, так как объявленные базы данных открываются (и создаются, если не были созданы ранее) при запуске программы.
DBAppendZ(<имя базы>:String, <поле1>, ... , <полеN>) - добавляет запись в конец базы данных. Количество полей и их типы должны в точности совпадать с полями базы данных. Имя базы данных записывается в кавычках.
DBAppendA(<имя базы>:String, <поле1>, ... , <полеN>) - добавляет запись в начало базы данных. Количество полей и их типы должны в точности совпадать с полями базы данных. Имя базы данных записывается в кавычках.
DBDelete(<имя базы>:String, <поле1>, ... , <полеN>) - удаляет из базы данных запись. Количество полей и их типы должны в точности совпадать с полями базы данных. Возможно, удалять сразу группу записей, если какие-либо из полей будут обозначены пустой константой nil. Тогда будут удалены все записи базы данных, в которых совпадают значения остальных полей (которые имеют значения отличные от nil).
DBClear(<имя базы>:String) - очищает базу данных.
Предикаты работы с файлами.
Данная версия Пролога работает только с текстовыми файлами.
Для идентификации файла при работе программы используется целочисленный номер обработчика файла, по которому можно обращаться к файлу.
FileOpenRead(<имя файла>:String, <номер обработчика>:Integer) - открыть файл для чтения. Предикат возвращает во втором параметре номер обработчика файла. Во втором параметре предиката должна стоять свободная переменная.
FileOpenWrite(<имя файла>:String, <номер обработчика>:Integer) - открыть файл для записи. Предикат возвращает во втором параметре номер обработчика файла. Во втором параметре предиката должна стоять свободная переменная.
FileRead(<номер обработчика>:Integer,<значение>) - чтение из файла. Второй параметр должен быть свободной переменной, иначе интерпретатор выдаст ошибку "Неверные параметры при вызове предиката".
FileWrite(<номер обработчика>:Integer,<значение>:String) - запись в файл.
FileClose(<номер обработчика>:Integer) - закрытие файла. Данный предикат применять не обязательно, так как при завершении программы интерпретатор сам закрывает все открытые файлы.
EOF(<номер обработчика>:Integer) - проверка конца файла. Предикат истинен, если конец файла достигнут.
Разное.
StringToList (String, <список>) - превращает строку в список, состоящий из символов этой строки, и возвращает его через параметр <список>.
Fail - предикат всегда возвращает ложь.
Арифметические функции.
Sin (<Integer, Real>):Real - операция синуса. Аргументом может быть как реальное, так и целое число. Функция возращает реальное число.
Cos (<Integer, Real>) :Real - операция косинуса.
Tan (<Integer, Real>) :Real - операция тангенса.
Exp (<Integer, Real>) :Real - экспонента.
Ln (<Integer, Real>) :Real - натуральный логарифм.
Int (<Integer, Real>) :Integer - выделение целой части числа. Функция используется также для явного преобразования реального числа в целое.
Frac (<Integer, Real>) :Real - выделение дробной части числа.
Abs(<Integer, Real>):<Integer, Real> - взятие модуля числа.
Функции работы со строками.
SubStr(String, N1:Integer, N2:Integer):String - выделение подстроки, начиная с элемента с индексом N1 длиной N2 символов.
FindStr(S1:String, S2:String):Integer - находит позицию подстроки S2 в строке S1 и возвращает индекс первого символа подстроки в строке S1. Если в строке S1 не было найдено подстроки S2, то функция возвращает 0.
Chr(Integer):String - возвращает символ, соответствующий числу по таблице ASCII.
Asc(String):Integer - возвращает ASCII-код первого символа строки.
NumbToStr(<Integer или Real>):String - превращает число в строку
StrToNumb(String):<Integer или Real> - превращает строку в целое или реальное число, в зависимости от содержания строки. Интерпретатор сначала пытается преобразовать строку в целое число. Если не получается, то пытается превратить строку в реальное число. Если преобразование не удалось, то выводится сообщение об ошибке.
Логические функции.
Not(Boolean):Boolean - инвертирует значение логического выражения. (ВНИМАНИЕ: чтобы инвертировать значение, возвращаемое предикатом или базой данных необходимо перед именем предиката или базы данных поставить символ "~")
Трудоемкость разработки программного обеспечения рассчитывается по формуле:
ч/м, где (4.1)L - объем программы в операторах, шт.,
nn - норма производительности труда программиста, представляющая собой объем полезной работы, выполняемой в единицу времени,
Ф - среднемесячный фонд рабочего времени,
Кн - коэффициент новизны,
Кун - коэффициент использования в разработке типовых программ.
L = 10000
nn = 50
Ф = 25
Кн = 0.8
Кун = 0.7
Таким образом, трудоемкость разработки ПО составляет:
Tn = (10000·0.8·0.7)/(25·50) = 4.5 ч/м
Расчет стоимости ч/м программиста:
· заработная плата программиста составляет 460 руб.
· дополнительная заработная плата составляет 20% от основной, то есть 92 руб.
· Начисления на заработную плату ,в целом, составляют 38.5% от основной и дополнительной заработной платы, 212.52 руб.
Итого стоимость ч/м:
460+92+212.52=764.52 руб.
Накладные расходы составляют:
Знакл=0.25·460=115 руб.
Стоимость одного машинного часа с учетом первоначальной стоимости ЭВМ, стоимости потребляемой электроэнергии и износа машины определяетсяпо формуле:
Sмч=Sмаш1+Sэл+Sрем.
Срок службы ЭВМ - 8 лет. Первоначальная стоимость - 20000 руб. Потребляемая мощность 0.2 кВт/ч.
При эксплуатации машины 8 часов в день имеем:
Sмаш1=20000/(8·12·22·8)=1.18 руб/ч.
Принимая стоимость электроэнергии 0.1 руб/КВт, стоимость потребляемой энергии в час равна:
Sэл=0.1·0.2=0.02 руб.
Затраты на профилактическое обслуживание и ремон составляют 20% от стоимости машины:
Sрем=0.2·1.18=0.17руб.
Тогда стоимость одного машинного часа равна
Sмч=1.18+0.2+0.17=1.37 руб/ч.
Себестоимость программного продукта определяется:
, гдеЗод - сумма основной и дополнительной заработной платы разработчика программы, начисления на нее и накладные расходы, руб./мес.,
Тап - время затрачиваемое разработчиком на разработку, составление алгоритма и написание программы, мес.,
См - себестоимость одного часа машинного времени, руб.,
Кисп = 0.5 - коэффициент использования ЭВМ.
764.52·4.5+8·4.5·1.37·25·0.5= 4056.84 руб.