Компоновка данных из строки
Файл string.pro
/* Строка -> список */
domains
text=string
string_list=symbol*
predicates
translate(text,string_list)
clauses
translate(Text,[H|T]):-
fronttoken(Text,H,Text1),!,
translate(Text1,T).
translate(_,[]).
При преобразовании данных из строки в список используем встроенный предикат извлечения атомов (последовательностей символов) fronttoken (можно еще использовать frontchar). После того как выполнится требование второго предиката, начнется преобразование.
Цели могут быть такими: translate(“тест есть тест”,L); translate(“тест”,L)
Компоновка из БД
Файл bd.pro
/* БД -> список */
domains
name = string
speed = real
list = speed *
predicates
car(name,speed)
sum_list(list,speed,integer)
car_velocity
clauses
/* Факты */
car("Ferrari F40",280).
car("Ford Mustang",210).
car("LAmborghini Countach",260).
car("Maclaren F1",320).
car_velocity:-findall(Value,car(_,Value),Speed_list),
sum_list(Speed_list,Sum,Number),
Average_speed=Sum/Number,
write("Средняя скорость =",Average_speed).
sum_list([],0,0).
sum_list([H|T],Sum,Number):-sum_list(T,Sum1,Number1),
Sum=Sum1+H,
Number=Number1+1.
goal
makewindow(1,7,7,"Средняя скорость автомобилей",15,0,8,80),
car_velocity
В примере происходит перевод данных о скорости автомобилей в список, а затем расчет средней скорости. Для преобразования данных из БД используем встроенный в Пролог предикат findall.
Findall(Value,car(_,Value),Speed_list), здесь:
• Value - объект входного предиката (что выбирается)
• car(_,Value) - входной предикат (откуда выбирается)
• Speed_list - выходной список (куда выбирать), его элементы принадлежат тому же домену, что и объект входного предиката.
Пытаясь удовлетворить цель car_velocity вызывается подцель findall, далее подцель sum_list, а за ней подцель Average_speed (рассчитывается средняя скорость). После удовлетворения предиката write в окне выведутся данные о средней скорости автомобилей, указанной в 4 утверждениях предиката car.
Компоновка из ДБД
Файл dbd.pro
/* ДБД -> список */
domains
name = string
speed = real
list = speed *
database
dcar(name,speed)
predicates
car(name,speed)
print_list(list)
sum_list(list,speed,integer)
car_velocity
assert_database
clear_database
clauses
assert_database:-
car(Car_name,Car_speed),assertz(dcar(Car_name,Car_speed)),fail.
assert_database:-!.
clear_database:-
retract(dcar(_,_)),fail.
clear_database:-!.
car_velocity:-findall(Value,car(_,Value),Speed_list),
sum_list(Speed_list,Sum,Number),
Average_speed=Sum/Number,
write("Средняя скорость =",Average_speed).
sum_list([],0,0).
sum_list([H|T],Sum,Number):-sum_list(T,Sum1,Number1),
Sum=Sum1+H,
Number=Number1+1.
print_list([H|T]):-write(H),nl,print_list(T).
/* Факты */
car("Ferrari F40",280).
car("Ford Mustang",210).
car("LAmborghini Countach",260).
car("Maclaren F1",320).
goal
makewindow(1,7,7,"Средняя скорость автомобилей",1,0,8,80),
car_velocity
Преобразование из ДБД очень похоже на преобразование из БД, отличия связаны собственно с применением ДБД:
• появляется раздел database
• предикаты связанные с загрузкой фактов в ДБД
В выполнении программы существенных отличий от компоновки данных из обычной БД нет.
|