Начало истории языка относится к 1970-м годам.[7] Будучи декларативным языком программирования, Пролог воспринимает в качестве программы некоторое описание задачи или баз знаний и сам производит логический вывод, а также поиск решения задач, пользуясь механизмом бэктрекинга (англ. backtracking) и унификацией.
Prolog использует один тип данных, терм, который бывает нескольких типов:
· атом это отдельный объект, считающийся элементарным. В SWI-Prolog атом представляется последовательностью букв нижнего и верхнего регистра, цифр и символа подчеркивания ‘_’, начинающейся со строчной буквы. Кроме того, любой набор допустимых символов, заключенный в апострофы, также является атомом. Наконец, комбинации специальных символов + - * = < > : & также являются атомами;
· числа в SWI-Prolog бывают целыми (Integer) и вещественными (Float).;
· переменная являются строки символов, цифр и символа подчеркивания, начинающиеся с заглавной буквы или символа подчеркивания;
· составные термы (функции) состоят из имени функции (нечислового атома) и списка аргументов (термов SWI-Prolog, то есть атомов, чисел, переменных или других составных термов), заключенных в круглые скобки и разделенных запятыми. Группы составных термов используют для составления фраз SWI-Prolog. Нельзя помещать символ пробела между функтором (именем функции) и открывающей круглой скобкой. В других позициях, однако, пробелы могут быть полезны для создания более читаемых программ.
Факт – это утверждение о том, что соблюдается некоторое конкретное отношение. Он является безусловно верным.
Арифметические выражения в языке SWI-Prolog имеется ряд встроенных функций для вычисления арифметических выражений, некоторые из которых перечислены в таблице 3.1.
Таблица 3.1.
«Арифметические выражения»
X + Y | Сумма X и Y |
X - Y | Разность X и Y |
X * Y | Произведение X и Y |
X / Y | Деление X на Y |
X mod Y | Остаток от деления X на Y |
X // Y | Деление нацело X на Y |
X ** Y | Возведение X в степень Y |
- X | Смена знака X |
abs(X) | Абсолютная величина числа X |
max(X,Y) | Большее из чисел X и Y |
min(X,Y) | Меньшее из чисел X и Y |
sqrt(X) | Квадратный корень из X |
random(Int) | Случайное целое число в диапазоне от 0 до Int |
sin(X) | Синус X |
cos(X) | Косинус X |
tan(X) | Тангенс X |
log(X) | Натуральный логарифм (ln) числа X |
log10(X) | Десятичный логарифм (lg) числа X |
float(X) | Вещественное число, соответствующее целому числу X |
pi | 3.14159 (приближенное значение числа ) |
е | 2.71828 (приближенное значение числа е) |
Список символов может быть представлен в виде строк, например, первый аргумент составного терма возраст (‘Борис’,10) - строка. При записи строки заключаются в кавычки.
Запятая между фактами означает операцию логического и (конъюнкцию), факт может быть записан в виде предиката, аргументы которого являются символьными или числовыми константами.
В общем случае предикат – это логическая функция от одного или нескольких аргументов, то есть функция, действующая в множество из двух значений: истина и ложь. Предикат SWI-Prolog записывается в виде составного терма:
имя_предиката (аргументы).
База данных на SWI-Prolog – это совокупность фактов. В процессе работы в базу данных можно добавлять новые факты, удалять или изменять старые.
Запрос - это последовательность предикатов, разделенных запятыми и завершающаяся точкой. С помощью запросов можно “спрашивать” базу данных о том, какие утверждения являются истинными. Предикат запроса называется целью.
Кроме фактов программы на языке SWI-Prolog могут содержать правила, позволяющие получать дополнительные знания о том мире, который описывает программа. Правило задает новый предикат через определенные ранее.
Правило состоит из головы (предиката) и тела (последовательности предикатов, разделенных запятыми). Голова и тело разделены знаком ‘:–’ и, подобно каждой фразе SWI-Prolog, правило должно заканчиваться точкой.
Знак ‘:–’ есть схематическая запись стрелки (<-) и показывает, что из правой части следует левая. Этот знак читается как “если”. Интуитивный смысл правила состоит в том, что цель, являющаяся головой, будет истинной, если SWI-Prolog сможет показать, что все выражения (подцели) в теле правила являются истинными.
3.2 Создание правил продукционной модели
Входные данные продукционной модели представим в таблице 3.2 в виде таблицы в которой будет представлен вопрос , переменная которая ему соответствует и варианты ответа.
Таблица 3.2
«Входные данные»
Вопрос | Переменная | Варианты ответа |
18. На каком курсе вы учитесь? | KYRS | · 1(1 курс)· 2(2 -6 курсы) |
19. Проживаете ли вы в общежитии? | LP | · Yes· No |
20. Хорошие ли у Вас отношения с одногрупниками? | LIO | · Yes· No |
21. Хорошие ли у Вас отношения с куратором? | LIK | · Yes· No |
22. Ваши родители одобряют Ваш выбор? | LSR | · Yes· No |
23. Вам нравится Ваша специальность? | LSS | · Yes· No |
24. Сколько часов в день Вы тратите на выполнение лабораторных работ? | PSP | · 1· 2· 3 |
25. Сколько часов в день Вы тратите на подготовку к лекциям? | PSL | · 1· 2· 3 |
26. Сколько раз в месяц вы посещаете библиотеку? | PSB | · 1· 2· 3 |
27. Оцените по 100-балльной системе Ваше посещение лекций? | PL | · 30· 60· 100 |
28. Оцените по 100-балльной системе Ваше посещение практических занятий? | PP | · 30· 60· 100 |
29. Какой у Вас средний балл прошлой сессии? | YSB | · 3· 4· 5 |
30. Вы довольны результатами предыдущей сессии? | YSS | · Yes· No |
31. Ваш средний балл аттестата в школе? | YHB | · 3· 4· 5 |
32. Ваша школа имеет высокий уровень по техническим предметам? | YHY | · Yes· No |
33. Ваша текущая успеваемость, примерно в баллах? | YTB | · 3· 4· 5 |
34. Вы считаете , что полностью отдаетесь учебе? | YTS | · Yes· No |
На основе этих данных построим базу знаний продукционной модели с помощью простой конструкции :
Если (условие), то (действие),
Набор правил для экспертной системы прогнозирования сдачи сессии студентами на основании текущей успеваемости:
3. If LIO=”Yes” and LIK=”Yes” then LI = “Yes”
4. If LIO=”Yes” and LIK=”No” then LI = “Yes”
5. If LIO=”No” and LIK=”Yes” then LI = “No”
6. If LIO=”No” and LIK=”No” then LI = “No”
7. If LSR=”Yes” and LSS=”Yes” then LS= “Yes”
8. If LSR=”Yes” and LSS=”No” then LS= “No”
9. If LSR=”No” and LSS=”Yes” then LS= “Yes”
10. If LSR=”No” and LSS=”No” then LS= “No”
11. If LS=”Yes” and LI=”Yes” and LP = “Yes” then L= “good”
12. If LS=”Yes” and LI=”Yes” and LP = “No” then L= “good”
13. If LS=”Yes” and LI=”No” and LP = “Yes” then L= “good”
14. If LS=”Yes” and LI=”No” and LP = “No” then L= “bed”
15. If LS=”No” and LI=”Yes” and LP = “No” then L= “good”
16. If LS=”No” and LI=”Yes” and LP = “Yes” then L= “good”
17. If LS=”No” and LI=”No” and LP = “Yes” then L= “bed”
18. If LS=”No” and LI=”No” and LP = “No” then L= “bed”
19. If PSL=1 and PSP=1 and PSB=1 then PS= 1
20. If PSL=1 and PSP=1 and PSB=2 then PS= 1
21. If PSL=1 and PSP=1 and PSB=3 then PS= 2
22. If PSL=1 and PSP=2 and PSB=1 then PS= 2
23. If PSL=1 and PSP=2 and PSB=2 then PS= 3
24. If PSL=1 and PSP=2 and PSB=3 then PS= 2
25. If PSL=1 and PSP=3 and PSB=1 then PS= 2
26. If PSL=1 and PSP=3 and PSB=2 then PS= 3
27. If PSL=1 and PSP=3 and PSB=3 then PS= 3
28. If PSL=2 and PSP=1 and PSB=1 then PS= 2
29. If PSL=2 and PSP=1 and PSB=2 then PS= 2
30. If PSL=2 and PSP=1 and PSB=3 then PS= 3
31. If PSL=2 and PSP=2 and PSB=1 then PS= 2
32. If PSL=2 and PSP=2 and PSB=2 then PS= 2
33. If PSL=2 and PSP=2 and PSB=3 then PS= 3
34. If PSL=2 and PSP=3 and PSB=1 then PS= 3
35. If PSL=2 and PSP=3 and PSB=2 then PS= 3
36. If PSL=2 and PSP=3 and PSB=3 then PS= 3
37. If PSL=3 and PSP=1 and PSB=1 then PS= 2
38. If PSL=3 and PSP=1 and PSB=2 then PS= 2
39. If PSL=3 and PSP=1 and PSB=3 then PS= 3
40. If PSL=3 and PSP=2 and PSB=1 then PS= 2
41. If PSL=3 and PSP=2 and PSB=2 then PS= 3
42. If PSL=3 and PSP=2 and PSB=3 then PS= 3
43. If PSL=3 and PSP=3 and PSB=1 then PS= 3
44. If PSL=3 and PSP=3 and PSB=2 then PS= 3
45. If PSL=3 and PSP=3 and PSB=3 then PS= 3
46. If PL<30 and PP<30 and PS=1 then P=1
47. If PL<30 and PP<30 and PS=2 then P=1
48. If PL<30 and PP<30 and PS=3 then P=2
49. If PL<30 and 30<PP<60 and PS=1 then P=1
50. If PL<30 and 30<PP<60 and PS=2 then P=2
51. If PL<30 and 30<PP<60 and PS=3 then P=2
52. If PL<30 and PP>60 and PS=1 then P=2
53. If PL<30 and PP>60 and PS=2 then P=2
54. If PL<30 and PP>60 and PS=3 then P=3
55. If 30<PL<60 and PP<30 and PS=1 then P=1
56. If 30<PL<60 and PP<30 and PS=2 then P=1
57. If 30<PL<60 and PP<30 and PS=3 then P=2
58. If 30<PL<60 and 30<PP<60 and PS=1 then P=1
59. If 30<PL<60 and 30<PP<60 and PS=2 then P=2
60. If 30<PL<60 and 30<PP<60 and PS=3 then P=2
61. If 30<PL<60 and PP>60 and PS=1 then P=2
62. If 30<PL<60 and PP>60 and PS=2 then P=2
63. If 30<PL<60 and PP>60 and PS=3 then P=3
64. If PL>60 and PP<30 and PS=1 then P=1
65. If PL>60 and PP<30 and PS=2 then P=1
66. If PL>60 and PP<30 and PS=3 then P=2
67. If PL>60 and 30<PP<60 and PS=1 then P=1
68. If PL>60 and 30<PP<60 and PS=2 then P=3
69. If PL>60 and 30<PP<60 and PS=3 then P=3
70. If PL>60 and PP>60 and PS=1 then P=2
71. If PL>60 and PP>60 and PS=2 then P=2
72. If PL>60 and PP>60 and PS=3 then P=3
73. If YHB=3 and YHY=”Yes” then YH=3
74. If YHB=3 and YHY=”No” then YH=3
75. If YHB=4 and YHY=”Yes” then YH=5
76. If YHB=4 and YHY=”No” then YH=4
77. If YHB=5 and YHY=”Yes” then YH=5
78. If YHB=5 and YHY=”No” then YH=4
79. If YTB=3 and YTS=”Yes” then YT=3
80. If YTB =3 and YTS =”No” then YT=3
81. If YTB =4 and YTS =”Yes” then YT=3
82. If YTB =4 and YTS =”No” then YT=4
83. If YTB =5 and YTS =”Yes” then YT=5
84. If YTB =5 and YTS =”No” then YT=5
85. If YSB=3 and YSS=”Yes” then YS=3
86. If YSB=3 and YSS=”No” then YS=3
87. If YSB=4 and YSS=”Yes” then YS=4
88. If YSB=4 and YSS=”No” then YS=4
89. If YSB=5 and YSS=”Yes” then YS=5
90. If YSB=5 and YSS=”No” then YS=3
91. If KYRS=1 and YH=3 and YT=3 then Y=3
92. If KYRS=1 and YH=3 and YT=4 then Y=3
93. If KYRS=1 and YH=3 and YT=5 then Y=4
94. If KYRS=1 and YH=4 and YT=3 then Y=3
95. If KYRS=1 and YH=4 and YT=4 then Y=4
96. If KYRS=1 and YH=4 and YT=5 then Y=5
97. If KYRS=1 and YH=5 and YT=3 then Y=4
98. If KYRS=1 and YH=5 and YT=4 then Y=4
99. If KYRS=1 and YH=5 and YT=5 then Y=5
100. If KYRS>1 and YS=3 and YT=3 then Y=3
101. If KYRS>1 and YS=3 and YT=4 then Y=3
102. If KYRS>1 and YS=3 and YT=5 then Y=4
103. If KYRS>1 and YS=4 and YT=3 then Y=4
104. If KYRS>1 and YS=4 and YT=4 then Y=4
105. If KYRS>1 and YS=4 and YT=5 then Y=5
106. If KYRS>1 and YS=5 and YT=3 then Y=4
107. If KYRS>1 and YS=5 and YT=4 then Y=4
108. If KYRS>1 and YS=5 and YT=5 then Y=5
109. If Y=3 and P=1 and L=”bed” then B=3