За разлика от други версии на Prolog, Visual Prolog е Prolog компилатор, боравещ с типове данни; вие се нуждаете да декларирате типовете на обектите, за които се отнасят предикатите. Декларациите на типовете позволяват Visual Prolog програмите да бъдат компилирани директно в машинен код, като по този начин се осигурява бързодействие подобно на бързодействието на компилаторите за С или Паскал.
Ще разгледаме 4 основни секции на Visual Prolog програма – където се декларират предикатите и аргументите, дефинират се правилата и се специфицират целите в програмата – в първата част на изложението. Във втората част от тази глава ще получим по-близка представа за декларациите и синтаксиса на правилата. И накрая, кратко ще бъдат изложени други секции на Visual Prolog програма, включително база данни, константи, различни глобални секции и директиви на компилатора.
Основни секции на Visual Prolog’ програми.
Най-общо Visual Prolog програмата включва 4 основни секции. Те са: секция на клаузите, секция на предикатите, секция на домените и секция на целите.
е сърцето на Visual Prolog програмата; това е мястото, където вие поставяте фактите и правилата, с които Visual Prolog ще оперира когато се опитва да удовлетвори цел от програмата.
Секцията на предикатите е тази, където се декларират предикатите и домените (типовете) на техните аргументи. (Не е необходимо да се декларират вградените предикати на Visual Prolog.)
Секцията на домените е тази, където се декларират домените, които се използват от програмата и не са от групата на стандартните домени (Не е необходимо да се декларират стандартните домени.)
Секцията на целите съдържа началната цел на програмата.
Секцията на клаузите
Ако вие сте разбрали какво са фактите и правилата и как да ги пишете на Prolog, вие знаете какво става в секцията на клаузите. Клаузите за даден предикат трябва да са разположени заедно в секцията за клаузи; последователността на клаузите, която дефинира предиката се нарича процедура.
Опитвайки се да удовлетвори дадена цел, Visual Prolog ща започне от началото на секцията на клаузите, проверявайки всеки факт, търсейки съпоставяне Движейки се надолу през клаузите Visual Prolog поставя вътрешни указатели до всяка клауза, която подхожда за текущата подцел. Ако тази клауза не е част от логическия път, който води към решението, Visual Prolog се връща към мрежата от указатели и търси друго съответствие (another math) – това е backtracking..
Секция на предикатите
Ако вие дефинирате свои собствени предикати в секцията на клаузите от програмата, то в секцията на предикатите те трябва да бъдат декларирани, иначе Visual Prolog няма да знае за какво става дума и какво има предвид програмиста. Когато декларирате предикат вие казвате на Visual Prolog към кои домени принадлежат аргументите на предиката.
Visual Prolog се доставя с достатъчен набор от вградени предикати. Вградените предикати не е необходимо да се декларират. Visual Prolog on-line помощ дава пълни обяснения относно вградените предикати.
Фактите и правилата дефинират предикатите. Секцията на предикатите съдържа списък на предикатите, показвайки типа (домените ) на аргументите.
Как се декларират потребителски дефинирани предикати
Декларацията на предиката започва с името на предиката, следвано от лява отваряща скоба. След това се поставя списък от типовете на аргументите на предиката. Прдикатът може и да няма аргументи.
predicateName(argument_type1, argument_type2, …, argument_typeN)
Последният аргумент се затваря с дясна скоба. Отбележете, че за разлика от клаузите в секцията с клаузи, декларзцията на предиката не завършва с точка. Типовете н ааргументите са някои от стандартните домени или домени, кооито вече са декларирани в секцията на домените.
Имена на предикатите
Имената на предикатите търябва да започват с буква, следвана от последователност от букви, цифри и долни тирета. Няма значение дали се използват малки или големи букви, но горещо се препоръчва като първа буква в името на предиката да се използва малка. Дилжината на името може да бъде до 250 символа.
В имената на предикатите не могат да се използват интервали, знак за минус, звездичка, наклонени черти или други небуквено-цифрови. Не се допуска и използването на букви от кирилицата. В таблицата по-долу са дадени валидните за конструирането на имената символи.
Големи латински букви : A, B, … , Z
Малки латински букви : a, b, … , z
Цифри : 0, 1, … , 9
Долно тире : _
Всяко име на предиката и аргументите могат да представляват комбинация от тези символи.
Примери за правилни и неправилни имена на предикати
Правилни имена на предикати Неправилни имена
Fact [fact]
is_a *is_a*
has_a has/a
patternCheckList pattern-Check-List
choose_Menu_Item choose Menu Item
predicateName predicate<Name>
first_in_10 >first_in_10
Аргументи на предикатите
Аргументите на предикатите трябва да принадлежат към познати на Visual Prolog домени. Доменът може да бъде стандартен или да е деклариран в секцията на домените.
Примери
Ако желаете да декларирате предиката my_predicate(symbol, integer) в секцията за предикати по начина
PREDICATES
my_predicate(symbol, integer)
вие не се нуждаете от декларация на типа на аргументите в секцията на домените, защото symbol и integer са стандартни домени. Но ако декларирате предиката my_predicate(name, number) в секцията на предикатите така:
PREDICATES
my_predicate(name, number)
то вие трябва да декларирате подходящи домени за name и number. Предполагайки, че вие искате те да са symbol и integer съответно, декларацията н адомена ще изглежда по следния начин:
DOMAINS
name = symbol
number = integer
PREDICATES
my_predicate(name, number)
В дадения по-долу фрагмент са показани още предикати и декларации на домени:
DOMAINS
person, activity = symbol
car, make, color = symbol
mileage, years_on_road, cost = integer
PREDICATES
likes(person, activity)
parent(person, person)
can_buy(person, car)
car(make, mileage, years_on_road, color, cost)
green(symbol)
ranking(symbol, integer)
Тази част от декларациите специфицира следната информация за тези предикати и техните аргументи:
Предикатът likes има два аргумента (person и activity), всеки от които принадлежи към уникалния symbol домен (което значи, че техните стойности са имена, а не числа).
Предикатът parent има два person аргумента, където person е от тип symbol .
Предикатът can_buy има два аргумента, person и car, като и дват аса от тип symbol.
Предикатът car има пет аргумента: make и color са от уникалния тип домени symbol, докатоe mileage, years_on_road, и cost са от уникалния тип домени integer .
Предикатът green има един аргумент- symbol: не е необходимо той да бъде допълнително деклариран, защото е от стандартен домен symbol.
Предикатът рranking има два аргумента. И двата принадлежат към стандартни домейни (symbol и integer), поради което не се нуцдаят от деклариране на типовете им.
The Domains Section
Секция на домените
В традиционния Prolog има само един тип - терм. Същото го има и във Visual Prolog, но ние декларираме в какви домени действително попадат аргументите на предикатите.
Домените позволяват да се дават характерни имена на различните видове данни, които иначе биха изглеждали твърде приличащи си. Във Visual Prolog програмите обектите в отношението (аргументите на предиката) принадлежат на домени; те могат да са предварително дефинирани домени или специални домени, които програмистът определя.
Секцията на домените служи на две много важни цели. Първо, вие можете да дадете значещи имена на домените, даже ако вътрешно те се представят като едни и същи домени, които съществуват. Второ, специални дедкларации на домени се използват за деклариране на структури от данни, кооито не са дедфинирани като стандартни домени.
Полезно е понякога да се декларира домен, когато желаете да изчистите част от секцията на предикатите. Декларирането на собствени домени помага документирането на предикатите посредством даването им на полезни имена на типовете аргументи.
Примери
По-долу се дава пример за илюстрация на това как декларацията на домен помага за документиране на предикати
Frank is a male who is 45 years old.
Чрез предефинирани (предварително дефинирани, стандартни) домени вие можете да стигнете до следната декларация на предиката:
person(symbol, symbol, integer)
Тази декларация ще работидобре в много случаи. Но да предположим, че вие искате да поддържате цода на програмата един месец след като е написана. Предишната декларация няма да значи кой знае колко много след 6 месеца. Дадената, обаче, по-долу декларация ще помогне добре да разберете и да се ориентирате какви аргументи са били използвани в предиката:
DOMAINS
name, sex = symbol
age = integer
PREDICATES
person(name, sex, age)
Едно от главните предимства на тези декларации е, че Visual Prolog може да прехваща грешки от неправилно използване на типовете данни, както следната очевидна грешка:
same_sex(X, Y) :-
person(X, Sex, _),
person(Sex, Y, _).
Даже макар и name и sex да се дефинирани като symbol, те не са еквивалентни един на друг. Това позволява на Visual Prolog да открива грешка, ако вие случйно ги размените. Тази характеристика е много полезна когато програмите стават големи и сложни.
Може би вие жекаете да знаете защо не се използват специални домени за всички декларации на аргументи след като специалните домени предават значението на аргументите толкова добре? Отговорът е в това, че след като даден аргумент е типизиран като специфичен домен, този домен не може да бъде смесван с други домен, който вече е деклариран, даже ако домените са същите! И така, даже макар name и sex да са от един и същи домен (symbol), те не могат да се смесват. Обаче, всички дефинирани от потребителя домени могат matched с предефинираните домени.
Дадената по-долу програма ще “произведе” type error (грешка от вид неправилен тип на данните), когато се стартира:
/* Program ch03e01.pro */
DOMAINS
product,sum = integer
PREDICATES
add_em_up(sum,sum,sum)
multiply_em(product,product,product)
CLAUSES
add_em_up(X,Y,Sum):-
Sum=X+Y.
multiply_em(X,Y,Product):-
Product=X*Y.
Тази програма прави две неща: събира и умножава.
Задавйки целта
add_em_up(32, 54, Sum).
Visual Prolog ще отговори
Sum=86
1 Solution
което е правилната сума от двете цели числа, попставени в програмата.
От друга страна, тази програма ще умножава два аргумента сс предиката multiply_em. Нека да експериментираме. Ако трябва да получим произведението на 31 и 13 ние ще въведем целта:
multiply_em(31, 13, Product).
Visual Prolog ще отговори правилно с резултата.
Product=403
1 Solution
Но нека да предположим, че се нуждаем от сумата на 42 и 17; целта в програмата за което ще бъде
add_em_up(42, 17, Sum).
Сега искаме да удвоим произведението на 31 и 17, поради което поставяме целта:
multiply_em(31, 17, Sum), add_em_up(Sum, Sum, Answer).
Вероятно очаквате Visual Prolog да върне
Sum=527, Answer=1054
1 Solution
Нищо подобно! Вместо това той ви изпраща съобщение за грешка в типа на данните. Случило се е това, че вие се опитвате да предадете резултата от умножението, получен от multiply_em (това е от домен product), като първи и втори аргумент на add_em_up, който има домени от тип sum. Това произвежда грешка в типовете, защото product е различенi от sum домен. Даже, ако и двата домена да са реално от тип integer, те са различни домени и се третират като такива.
И така, ако променлива е използвана в повече от един предикат в рамките на една клауза, тя трябва да бъде декларирана по един и същи начин във всеки предикат. Разгледаната концепция трябва добре да се знае, за да се предоазим от неприятни грешки и съобщения.
За по-нататъшното изясняване на това как може да се използват декларациите на доимените за прихващане на грешки от вида тип на данните, да разгледаме следния пример:
/* Program ch03e02.pro */
DOMAINS
brand,color = symbol
age = byte
price, mileage = ulong
PREDICATES
nondeterm car(brand,mileage,age,color,price)
CLAUSES
car(chrysler,130000,3,red,12000).
car(ford,90000,4,gray,25000).
car(datsun,8000,1,black,30000).
Тук предикатът car , деклариран в секцията на предикатите има пет аргумента. Един принадлежи на домена age, който е от тип. Във фамилията ‘x86 процесори byte е 8-битово цяло число без знак със стойности между 0 и 255, включително. По подобие домените mileage и price са от тип ulong, което е 32-битово цяло без знак число, и домените brand и color от тип symbol.
car(renault, 13, 40000, red, 12000).
car(ford, 90000, gray, 4, 25000).
car(1, red, 30000, 80000, datsun).
Всяка цел “произвежда” грешка в домена. В първия случай, например, това е поради факта, че age трябва да бъде byte. От тук, Visual Prolog може лесно да открие дали някои типове в тази цел Sense Visual Prolog can easily detect if someone typing in this goal has reversed the mileage and age objects in predicate car. Във втория случай, age и color са разменеи, а в третия се опитайт есами да намерите проблема.
Web design and SEO topics: алгоритми, Компютри, програми, програмиране, функции