Home » Projects » AI-Trader » Sample Session
AI-Trader
Sample Session
The interface of the AI-Trader is defined via simple ASCII-based
commands. Although the graphical user interface masks these internal
implementation details, the following sample session provides a good
insight of the AI-Trader's capabilities. The script presented below runs
without modification with the text based version of the AI-Trader.
/*
* STEP 1
* ------
* Define a few relations on words and their mathematical properties
* as well as the top and bottom element of the concept type lattice.
*/
@register-relation 'SYNONYM' : @reflexive, @transitive, @symmetric
@register-relation 'ANTONYM' : @symmetric
@register-relation 'IS_A' : @reflexive, @transitive, @acyclic
@add-word something
/*
* STEP 2
* ------
* Define a matching rule which matches graphs based on
* syntactical equivalence.
*/
@define-matching-rule 'Specialization'
%
% Specialization
%
isa(Node1, Node2) :-
cg_getname(Node1, Name1), cg_getname(Node2, Name2),
cg_matchword(Name1, ['IS_A', 'SYNONYM'], Name2).
match(Q, T, Res) :-
cg_gettype(Q, concept),
isa(T, Q),
cg_getsucc(T, Tsucc), cg_getsucc(Q, Qsucc),
match_lists_con(Qsucc, Tsucc, Res, 0, 0).
match(Q, T, Res) :-
cg_gettype(Q, relation),
isa(T, Q),
cg_getsucc(T, Tsucc), cg_getsucc(Q, Qsucc),
match_lists_rel(Qsucc, Tsucc, Res, 0, 0).
%
% determine the value of the best match of Q againts any T in Tlist
% - if exists i: 0 <= i < sizeof(Tlist) and match(Q, T_i) < 0; then
% Res = -1
% - else
% Res = max{match(Q, T_i) | 0 <= i < sizeof(Tlist)}
%
best_match(_, [], MaxVal, MaxVal).
best_match(Q, [T|Tlist], MaxVal, Res) :-
(cg_match(Q, T, Val) ; Val is 0),
(Val < 0
-> Res is Val
; best_match(Q, Tlist, max(Val, MaxVal), Res)).
%
% concept nodes:
% at least on subtree in the query must have a matching subtree in
% the type
%
match_lists_con([], _, 1000, _, 0) :- !.
match_lists_con([], _, Res, Sum, NSucc) :-
Res is round(Sum/NSucc),
Res > 0.
match_lists_con([Q|Qlist], Tlist, Res, Sum, NSucc) :-
best_match(Q, Tlist, 0, BestMatch),
(BestMatch > 0
-> NewSum is Sum+BestMatch
; NewSum is Sum),
match_lists_con(Qlist, Tlist, Res, NewSum, NSucc+1).
%
% relation nodes:
% every subtree in the query must have a matching subtree in the type
%
match_lists_rel([], _, 1000, _, 0) :- !.
match_lists_rel([], _, Res, Sum, NSucc) :-
Res is round(Sum/NSucc),
Res > 0.
match_lists_rel([Q|Qlist], Tlist, Res, Sum, NSucc) :-
(Q, Tlist, 0, BestMatch),
BestMatch > 0,
match_lists_rel(Qlist, Tlist, Res, Sum+BestMatch, NSucc+1).
@end
/*
* STEP 3
* ------
* Define a matching rule for negation
*/
@define-matching-rule 'Negation'
%
% Negation
%
isa(Node1, Node2) :-
cg_getname(Node1, Name1), cg_getname(Node2, Name2),
cg_matchword(Name1, ['IS_A', 'SYNONYM'], Name2).
antonym(Node1, Node2) :-
cg_getname(Node1, Name1), cg_getname(Node2, Name2),
cg_matchword(Name1, ['IS_A', 'ANTONYM'], Name2).
match(Qcon, Tcon, -1) :-
cg_gettype(Qcon, concept),
isa(Tcon, Qcon),
cg_getsucc(Qcon, QrelList), cg_getsucc(Tcon, TrelList),
member(Qrel, QrelList), member(Trel, TrelList),
antonym(Trel, Qrel),
cg_getsucc(Qrel, QconList), cg_getsucc(Trel, TconList),
member(Qcon2, QconList), member(Tcon2, TconList),
isa(Tcon2, Qcon2).
@end
/*
* STEP 4
* ------
* Add the first conceptual graph describing 'vacation'.
* Before adding the graph, add the necessary words and relations
* (assume that our knowledge base already cantains 'culture', 'concert',
* 'exhibition', 'sightseeing' and 'characteristic').
*
* AI-Trader will return the unique service database key $0
* (output of the AI-Trader is not shown).
*
*/
@add-word vacation
@add-word activity
@add-relation vacation : 'IS_A' : something
@add-relation activity : 'IS_A' : human_activity
@add [vacation]->(characteristic)->[culture]-
->(activity)->[concert],
->(activity)->[exhibition],
->(activity)->[sightseeing].
/*
* STEP 5
* ------
* A lookup which succeeds. It matches with vacation from STEP 4.
*/
@match 'Specialization', 'Negation' :
[something] -> (characteristic) -> [human_activity]
/*
* STEP 6
* ------
* A lookup which does not succeed.
*/
@match 'Specialization', 'Negation' :
[something] -> (location) -> [town]
/*
* STEP 7
* ------
* Learn the new features of vacation. The query from STEP 6
* will now succeed:
* 'vacation' is a specialization of 'something' and
* 'city' is a synonym for 'town' ('town' is already known).
*/
@add-word city
@add-relation city : 'SYNONYM' : town
@join $0 : [vacation] -> (location) -> [city]
/*
* STEP 8
* ------
* A new service is to be exported. The conceptual graph which
* the service provider has chosen to "explain" his service is
* as follows:
* [vacation] -> (characteristic) -> [human_activity]
*
* First check if another graph resembles this one via the
* "@match" command.
*/
@match 'Specialization', 'Negation' :
[vacation] -> (characteristic) -> [human_activity]
/*
* STEP 9
* ------
* The description of a vacation from STEP 7 is too similar, the
* service provider decides to augment his inital description.
* He refines the definition of 'human_activity' und replaces it
* with `relaxation'.
* (assume that our knowledge base already cantains 'relaxation',
* 'beach', 'sport' and 'characteristic').
*
* AI-Trader will assign this graph the unique service database
* key $1.
*/
@add-word non_location
@add-relation location : 'ANTONYM' : non_location
@add [vacation] -
-> (characteristic) -> [relaxation] ,
-> (non_location) -> [city] ,
-> (location) -> [beach] ,
-> (activity) -> [sport] .
/*
* STEP 10
* -------
* The description of beach vacation is forwarded to the service
* provider offering a cultural vacation, where upon he decides to
* add a few describtion to his graph to refine it.
*
*/
@join $0 : [vacation] -
-> (accommodation) -> [hotel] ,
-> (duration) -> ['day' : 7] .
/*
* STEP 11
* -------
* The first query will *only* match "culture vacation" and the
* second *only* 'beach vacation'.
* The third query will match *both* graphs (i.e. $0 and $1).
*
*/
@match 'Specialization', 'Negation' :
[something] -> (location) -> [city]
@match 'Specialization', 'Negation' :
[something] -> (non_location) -> [town]
@match 'Specialization' :
[something] -> (characteristic) -> [human_activity]
/*
* STEP 12
* -------
* Add the addresses of the service providers and do a checkpoint of
* the trader's database.
*/
@add-provider $0 : 'Happy Holiday', 'hh@foo1.bar1'
@add-provider $1 : 'Our World', 'OurWorld@foo2.bar2'
@save 'checkpoint.kb'
[an error occurred while processing this directive]
|