Найти минимальное значение в динамической базе данных - Prolog

Узнай цену своей работы

Формулировка задачи:

Друзья, помогите пожалуйста. Написал программу для работы с динамической базой данных, которая содержит информацию о металлах: название, электропроводность, цена. Задача ещё состоит в том, чтобы найти по базе такой металл, который имеет минимальное значение сопротивления и при этом минимальную цену. Собственно, не могу понять, как это сделать на прологе используя динамическую базу данных....
Листинг программы
  1. DOMAINS
  2. file=p
  3. DATABASE
  4. dmetall(symbol,real,real)
  5. PREDICATES
  6. menu
  7. select(char)
  8. findquation
  9. find(char)
  10. delay
  11. start
  12. CLAUSES
  13. menu:- makewindow(4,7,7,"DB 'Metalls'",0,0,24,70),clearwindow,
  14. write("1 - Add new entry"),nl,
  15. write("2 - Search entry"),nl,
  16. write("3 - Edit entry"),nl,
  17. write("4 - Delete entry"),nl,
  18. write("5 - Show task solution"),nl,
  19. write("0 - Exit"), nl,nl,
  20. write("Select menu item: "),
  21. readchar(N), select(N).
  22. select('1'):-clearwindow,
  23. write("Enter metal name: "), readln(Name),
  24. write("Enter conduction: "), readreal(Conduction),
  25. write("Enter price: "), readreal(Price),
  26. assertz(dmetall(Name,Conduction,Price)),nl,
  27. write("Entry added!"),nl, delay, menu.
  28. select('2'):-clearwindow, findquation, menu.
  29. select('3'):-clearwindow,
  30. write("Enter metal name: "), readln(Name),
  31. retract(dmetall(Name,_,_)),
  32. write("Enter new conduction: "), readreal(Conduction),
  33. write("Enter new price: "), readreal(Price),
  34. assert(dmetall(Name,Conduction,Price)),nl,
  35. write("Entry was edited!"),nl, delay, menu.
  36. select('4'):-clearwindow,
  37. write("Enter metal name: "), readln(Name),
  38. retract(dmetall(Name,_,_)),
  39. write("Entry was deleted!"),nl, delay, menu.
  40.  
  41. select('0'):-save("C:\\labs\\metalls.ddb"),nl,nl,
  42. write("Database was saved to file."),nl,
  43. write("Goodbay baby!:)"),nl,
  44. retractall(_).
  45. select(_):-write("Error!"), delay, menu.
  46. findquation:-clearwindow,
  47. write("1 - Find entry by name"),nl,
  48. write("2 - Find entry by conduction"),nl,
  49. write("3 - Find entry by price"),nl,nl,
  50. write("Enter item: "),
  51. readint(F), find(F), delay.
  52. find(1):-clearwindow, write("Enter name: "),readln(Name),
  53. dmetall(Name, Conduction, Price),nl,
  54. write("Metall: "), write(Name),nl,
  55. write("Conduction: "), write(Conduction),nl,
  56. write("Price: "), write(Price),nl.
  57. find(1):-nl,write("Not found!").
  58. find(2):-clearwindow, write("Enter conduction: "), readreal(Conduction),
  59. dmetall(Name, Conduction, Price),nl,
  60. write("Metall: "), write(Name),nl,
  61. write("Conduction: "), write(Conduction),nl,
  62. write("Price: "), write(Price),nl.
  63. find(2):-nl, write("Not found!").
  64. find(3):-clearwindow, write("Enter price: "), readreal(Price),
  65. dmetall(Name, Conduction, Price),nl,
  66. write("Metall: "), write(Name),nl,
  67. write("Conduction: "), write(Conduction),nl,
  68. write("Price: "), write(Price),nl.
  69. find(3):-nl, write("Not found!").
  70. delay:-nl, write("Press any key..."), readchar(_).
  71. start:-existfile("C:\\labs\\metalls.ddb"),!,
  72. consult("C:\\labs\\metalls.ddb"), menu.
  73. start:-openwrite(p,"C:\\labs\\metalls.ddb"),
  74. closefile(p), menu.
  75. GOAL
  76. start
Подскажите куда копать, потому что не знаю, как это сделать на прологе... Вот набросал примерную базу данных, которая сохраняется в файле. В таблице: название металла, электр. сопротивление, цена металла выраженная в долларах за 1 грамм. Как, исходя из этой базы, найти мне металлы, которые имеют низкое сопротивление и низкую цену?
Листинг программы
  1. dmetall("silver",0.016,0.48)
  2. dmetall("copper",0.017,0.0047)
  3. dmetall("gold",0.024,37.2)
  4. dmetall("aluminium",0.028,0.0015)
  5. dmetall("tungsten",0.053,0.033)
  6. dmetall("zink",0.059,0.0012)
  7. dmetall("iron",0.098,0.0001)

Решение задачи: «Найти минимальное значение в динамической базе данных»

textual
Листинг программы
  1. database
  2.   % ---- отдельный факт в базе для сохранения рекорда
  3.   record(symbol, real)
  4. predicates
  5.   getMinimumConduction(symbol, real)
  6. clauses
  7.   getMinimumConduction(Name, Conduction) :-
  8.     % ---- инициализация значения рекорда
  9.     retractall(record(_, _)),
  10.     assert(record("Not found", 10000)),
  11.  
  12.     % ---- в этой точке возникнет развилка (для перебора вариантов)
  13.     dmetall(CurrentName, CurrentConduction, _),
  14.     record(RecordName, RecordConduction),
  15.  
  16.     % ---- если условие не выполняется, сразу откат к развилке
  17.     CurrentConduction < RecordConduction,
  18.  
  19.     % ---- если условие выполняется, обновляем значение рекорда
  20.     retractall(record(_, _)),
  21.     assert(record(CurrentName, CurrentConduction)),
  22.  
  23.     % ---- принудительный откат к развилке для продолжения перебора
  24.     fail;
  25.  
  26.     % ---- эта ветка сработает, когда перебор закончтся
  27.     record(Name, Conduction).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.625 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы