Prof. Marvin Minsky |
Prof. Winston, in his great book "Lisp", introduced a simple and clear Lisp formalization of the Frame Language by means of which we could represent knowledge about Henry, a man working at the Unit-I of a certain organization as a System analyst, as follows:
(setf (get 'Henry 'is-a) 'system-analyst)
(setf (get 'Henry 'working-at) 'unit-i)
(setf (get 'Henry 'gross-salary) 2500,00)
Ok. Nice. But what is a Frame?
Lets have a look at the implementation of a Frame as proposed by Prof. Winston as a simple associative nested list in LISP:
(Henry (is-a (value system-analyst))
(working-at(value unit-i ))
(recruitment-date (value "14/03/2010"))
(gross-salary (value 3000,00)))
Probably, many Clojurians are now thinking: “Hey! Came on! We can do that using associative maps. At the end, these Frames are only property lists”.
That’s not wrong. For example, our old fellow Henry can be described using a nested associative map as follows:
(def Henry {:is-a {:value 'system-analyst}
:working-at {:value 'unit-i}
:recruitment-date {:value "14/03/2010"}
:gross-salary {:value 3000,00}})
Please, note that system-analyst is itself a frame containing the FL description of a generic employee that works as a system analyst and, for example, has a certain base salary, health insurance, production bonus and other benefits.
To get Henry’s salary we can simply do:
(-> Henry :gross-salary :value)
But, hold on. Frames are not only associative data structures. For example, if we have another person named John that, at the time we are writing his description in FL, has an unknown salary:
(def John {:is-a {:value 'system-analyst}
:working-at {:value 'unit-i}
:years-in-the-role {:value 5}})
:working-at {:value 'unit-i}
:years-in-the-role {:value 5}})
If we try to use the same approach we used for Henry to get the salary information from the John's FL description we'll fail miserably.
We could estimate John's base salary using some general knowledge about the base salary of a System Analyst with 5 years of experience in the role of system-analyst.
If we can get elsewhere what was the average salary for a system analyst, for example 2000,00 EURO, and if it is known that the annual increment is 3%, we could calculate John's base salary as follows:
gross-salary = system-analyst-salary*(1+0,03)^(years-in-the-role)
We could estimate John's base salary using some general knowledge about the base salary of a System Analyst with 5 years of experience in the role of system-analyst.
gross-salary = system-analyst-salary*(1+0,03)^(years-in-the-role)
And, if we could store somewhere the above formula, when we wont to know John's wage we could, because John :isa 'system-analyst , adopt the the previous formula to estimate his basic wage.
In this case the simple property list we used to represent a person's features is not enough. The FL extend the power of a property list adding more sophisticated mechanisms as: default values, demons and inheritance.
We'll see all these mechanisms in this short series of posts but, I suggest you to read this post by Steve Yegge to open your mind on the generalized property list pattern.
Before to go to the Clojure implementation details, let me introduce some definitions:
Prof. Winston introduced several function to deal with frames in Lisp, the three basic functions, working on the frames as a simple nested property list, were:
In the next post I'd like to see how the Frame language paradigm extends the power of a property list adding more sophisticated mechanisms as: default values, daemons and inheritance.
In this case the simple property list we used to represent a person's features is not enough. The FL extend the power of a property list adding more sophisticated mechanisms as: default values, demons and inheritance.
We'll see all these mechanisms in this short series of posts but, I suggest you to read this post by Steve Yegge to open your mind on the generalized property list pattern.
Before to go to the Clojure implementation details, let me introduce some definitions:
- A frame is a nested "augmented" association list;
- A frame can represent a class of objects or an object; in our example system-analyst is a frame representing a class of employees while Henry frame is representing an instance of system-analyst;
- A frame is described/composed by one or more facts called slot; in our example :net-monthly-salary is a slot;
- A slot is described/composed by one or more information called facet; in our example :value is a facet.
Prof. Winston introduced several function to deal with frames in Lisp, the three basic functions, working on the frames as a simple nested property list, were:
- fget: fetches information. The user supplies an access path consisting of a frame, a slot, and a facet .
- fput: places information. As with fget the user supplies a frame-slot-facet access path.
- fremove: removes information. As with fget and fput , the user supplies a frame-slot-facet access path.
Loading ....
In the next post I'd like to see how the Frame language paradigm extends the power of a property list adding more sophisticated mechanisms as: default values, daemons and inheritance.
Nessun commento:
Posta un commento