Найти минимальное значение в динамической базе данных - Prolog
Формулировка задачи:
Друзья, помогите пожалуйста.
Написал программу для работы с динамической базой данных, которая содержит информацию о металлах: название, электропроводность, цена. Задача ещё состоит в том, чтобы найти по базе такой металл, который имеет минимальное значение сопротивления и при этом минимальную цену. Собственно, не могу понять, как это сделать на прологе используя динамическую базу данных....
Листинг программы
- DOMAINS
- file=p
- DATABASE
- dmetall(symbol,real,real)
- PREDICATES
- menu
- select(char)
- findquation
- find(char)
- delay
- start
- CLAUSES
- menu:- makewindow(4,7,7,"DB 'Metalls'",0,0,24,70),clearwindow,
- write("1 - Add new entry"),nl,
- write("2 - Search entry"),nl,
- write("3 - Edit entry"),nl,
- write("4 - Delete entry"),nl,
- write("5 - Show task solution"),nl,
- write("0 - Exit"), nl,nl,
- write("Select menu item: "),
- readchar(N), select(N).
- select('1'):-clearwindow,
- write("Enter metal name: "), readln(Name),
- write("Enter conduction: "), readreal(Conduction),
- write("Enter price: "), readreal(Price),
- assertz(dmetall(Name,Conduction,Price)),nl,
- write("Entry added!"),nl, delay, menu.
- select('2'):-clearwindow, findquation, menu.
- select('3'):-clearwindow,
- write("Enter metal name: "), readln(Name),
- retract(dmetall(Name,_,_)),
- write("Enter new conduction: "), readreal(Conduction),
- write("Enter new price: "), readreal(Price),
- assert(dmetall(Name,Conduction,Price)),nl,
- write("Entry was edited!"),nl, delay, menu.
- select('4'):-clearwindow,
- write("Enter metal name: "), readln(Name),
- retract(dmetall(Name,_,_)),
- write("Entry was deleted!"),nl, delay, menu.
- select('0'):-save("C:\\labs\\metalls.ddb"),nl,nl,
- write("Database was saved to file."),nl,
- write("Goodbay baby!:)"),nl,
- retractall(_).
- select(_):-write("Error!"), delay, menu.
- findquation:-clearwindow,
- write("1 - Find entry by name"),nl,
- write("2 - Find entry by conduction"),nl,
- write("3 - Find entry by price"),nl,nl,
- write("Enter item: "),
- readint(F), find(F), delay.
- find(1):-clearwindow, write("Enter name: "),readln(Name),
- dmetall(Name, Conduction, Price),nl,
- write("Metall: "), write(Name),nl,
- write("Conduction: "), write(Conduction),nl,
- write("Price: "), write(Price),nl.
- find(1):-nl,write("Not found!").
- find(2):-clearwindow, write("Enter conduction: "), readreal(Conduction),
- dmetall(Name, Conduction, Price),nl,
- write("Metall: "), write(Name),nl,
- write("Conduction: "), write(Conduction),nl,
- write("Price: "), write(Price),nl.
- find(2):-nl, write("Not found!").
- find(3):-clearwindow, write("Enter price: "), readreal(Price),
- dmetall(Name, Conduction, Price),nl,
- write("Metall: "), write(Name),nl,
- write("Conduction: "), write(Conduction),nl,
- write("Price: "), write(Price),nl.
- find(3):-nl, write("Not found!").
- delay:-nl, write("Press any key..."), readchar(_).
- start:-existfile("C:\\labs\\metalls.ddb"),!,
- consult("C:\\labs\\metalls.ddb"), menu.
- start:-openwrite(p,"C:\\labs\\metalls.ddb"),
- closefile(p), menu.
- GOAL
- start
Подскажите куда копать, потому что не знаю, как это сделать на прологе...
Вот набросал примерную базу данных, которая сохраняется в файле. В таблице: название металла, электр. сопротивление, цена металла выраженная в долларах за 1 грамм. Как, исходя из этой базы, найти мне металлы, которые имеют низкое сопротивление и низкую цену?
Листинг программы
- dmetall("silver",0.016,0.48)
- dmetall("copper",0.017,0.0047)
- dmetall("gold",0.024,37.2)
- dmetall("aluminium",0.028,0.0015)
- dmetall("tungsten",0.053,0.033)
- dmetall("zink",0.059,0.0012)
- dmetall("iron",0.098,0.0001)
Решение задачи: «Найти минимальное значение в динамической базе данных»
textual
Листинг программы
- database
- % ---- отдельный факт в базе для сохранения рекорда
- record(symbol, real)
- predicates
- getMinimumConduction(symbol, real)
- clauses
- getMinimumConduction(Name, Conduction) :-
- % ---- инициализация значения рекорда
- retractall(record(_, _)),
- assert(record("Not found", 10000)),
- % ---- в этой точке возникнет развилка (для перебора вариантов)
- dmetall(CurrentName, CurrentConduction, _),
- record(RecordName, RecordConduction),
- % ---- если условие не выполняется, сразу откат к развилке
- CurrentConduction < RecordConduction,
- % ---- если условие выполняется, обновляем значение рекорда
- retractall(record(_, _)),
- assert(record(CurrentName, CurrentConduction)),
- % ---- принудительный откат к развилке для продолжения перебора
- fail;
- % ---- эта ветка сработает, когда перебор закончтся
- record(Name, Conduction).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д