-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeveloper_level.CLP
More file actions
162 lines (143 loc) · 5.63 KB
/
Copy pathdeveloper_level.CLP
File metadata and controls
162 lines (143 loc) · 5.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
;; Developer Details Template ;;
(deftemplate developer-details
(slot first-name)
(slot last-name)
(slot months-of-experience (default 0))
(slot leadership-hours (default 0)))
;; Functions ;;
(deffunction ask-question (?question)
(printout t ?question)
(bind ?answer (read)))
(deffunction ask-restricted-question (?question $?allowed-values)
(printout t ?question)
(bind ?answer (read))
(if (lexemep ?answer)
then (bind ?answer (lowcase ?answer)))
(while (not (member$ ?answer ?allowed-values)) do
(printout t "Answer must be any of these: " ?allowed-values ". Please try again " crlf)
(printout t ?question)
(bind ?answer (read))
(if (lexemep ?answer)
then (bind ?answer (lowcase ?answer))))
?answer)
(deffunction yes-or-no-q (?question)
(bind ?response (ask-restricted-question ?question yes no y n))
(if (or (eq ?response yes) (eq ?response y))
then yes
else no))
(deffunction ask-value-question (?question)
(printout t ?question)
(bind ?answer (read))
(while (not (eq (type ?answer) INTEGER)) do
(printout t "--- Answer must be a whole number. Please try again -- " crlf)
(printout t ?question)
(bind ?answer (read)))
?answer)
(defrule get-dev-details "Get developer details"
(not (developer-level ?))
=>
(assert
(developer-details
(first-name (ask-question "What is the developer's first name? "))
(last-name (ask-question "What is the developer's last name? "))
(months-of-experience (ask-value-question "How many months of experience does this developer have? "))
(leadership-hours (ask-value-question "How many leadership hours does this developer have? ")))
))
(defrule print-dev-details "Print developer details"
(developer-details
(first-name ?first-name)
(last-name ?last-name)
(months-of-experience ?experience)
(leadership-hours ?hours))
=>
(printout t crlf "Details obtained." crlf)
(printout t "---------------------------------------" crlf)
(printout t "First Name: " ?first-name crlf)
(printout t "Last Name: " ?last-name crlf)
(printout t "Months of Experience: " ?experience crlf)
(printout t "Leadership Hours: " ?hours crlf)
(printout t "---------------------------------------" crlf))
(defrule system-banner ""
(declare (salience 10))
=>
(printout t crlf)
(printout t "------------------------------------------------------" crlf)
(printout t " Developer Level Expert System" crlf)
(printout t "------------------------------------------------------" crlf)
(printout t "This system is designed to help the managers at Devnations easily know the level of the developers within the company." crlf)
(printout t "Answer the questions provided " crlf)
(printout t "------------------------------------------------------")
(printout t crlf crlf))
(defrule check-dev-level-0
(not (developer-level ?))
(developer-details (first-name ?first-name)
(last-name ?last-name)
(months-of-experience ?experience)
(leadership-hours ?hours))
(test (eq ?experience 0))
=>
(assert (done))
(assert (developer-level ?first-name ?last-name dev-level-0 "a pre-entry level developer")))
(defrule check-dev-level-1
(not (developer-level ?))
(developer-details (first-name ?first-name)
(last-name ?last-name)
(months-of-experience ?experience)
(leadership-hours ?hours))
(test (> ?experience 0))
(test (< ?experience 10))
=>
(assert (done))
(assert (developer-level ?first-name ?last-name dev-level-1 "an entry level developer")))
(defrule check-dev-level-2
(not (developer-level ?))
(developer-details (first-name ?first-name)
(last-name ?last-name)
(months-of-experience ?experience)
(leadership-hours ?hours))
(test (>= ?experience 10))
(test (< ?experience 20))
(test (>= ?hours 40))
=>
(assert (done))
(assert (developer-level ?first-name ?last-name dev-level-2 "a mid level developer")))
(defrule check-dev-level-3
(not (developer-level ?))
(developer-details (first-name ?first-name)
(last-name ?last-name)
(months-of-experience ?experience)
(leadership-hours ?hours))
(test (>= ?experience 20))
(test (< ?experience 40))
(test (>= ?hours 90))
=>
(assert (done))
(assert (developer-level ?first-name ?last-name dev-level-3 "a senior level developer")))
(defrule check-dev-level-4
(not (developer-level ?))
(developer-details (first-name ?first-name)
(last-name ?last-name)
(months-of-experience ?experience)
(leadership-hours ?hours))
(test (> ?experience 40))
(test (>= ?hours 150))
=>
(assert (done))
(assert (developer-level ?first-name ?last-name dev-level-4 "a top level developer")))
(defrule check-dev-level-unknown
(not (developer-level ?))
(not (done))
(developer-details (first-name ?first-name)
(last-name ?last-name)
(months-of-experience ?experience)
(leadership-hours ?hours))
=>
(assert (developer-level ?first-name ?last-name unknown "The developer's details do not align with any level")))
(defrule print-result ""
(declare (salience 10))
(developer-level ?first-name ?last-name ?dev-level ?level-definition)
=>
(printout t crlf crlf)
(printout t "---------------------RESULT--------------------")
(printout t crlf crlf)
(printout t "The level of the developer " ?first-name " " ?last-name " is " ?dev-level ": " ?level-definition "." crlf))