Forward Chaining in HALO
-
Upload
esug -
Category
Technology
-
view
322 -
download
4
description
Transcript of Forward Chaining in HALO
Forward Chaining in HALOAn Implementation Strategy for History-based Logic Pointcuts
@International Conference On Dynamic Languages 2007,Lugano, August 27th, 2007
Charlotte Herzeel, Kris Gybels, Pascal Costanza, Coen De Roover and Theo D’hondtProgramming Technology LaboratoryVrije Universiteit Brussel
Overview• Introduction
• Logic Meta Programming & Aspect-Oriented Programming
• Running example - going shopping
• History-based Aspects using LOgic:
• Aspect-Oriented Programming for Lisp
• meta model = the program execution
• hybrid language (temporal logic programming/CLOS)
• Implementing HALO
• HALO weaver Architecture
• Query Engine based on RETE
• Reducing Memory Overhead
Scattering & tangling
Scattering & tanglingTyranny of the dominant decomposition
Scattering & tanglingTyranny of the dominant decomposition
tangling & scattering-- maintainability-- reusability-- readability
!
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
tangling & scattering-- maintainability-- reusability-- readability
!
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
tangling & scattering-- maintainability-- reusability-- readability
!
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
log sensitive operations = crosscutting concern
tangling & scattering-- maintainability-- reusability-- readability
!
CLOS: before, after, around
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
log sensitive operations = crosscutting concern
tangling & scattering-- maintainability-- reusability-- readability
!
CLOS: before, after, around
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
log sensitive operations = crosscutting concern
tangling & scattering-- maintainability-- reusability-- readability
!
(defmethod shareAccount :around ((c client), (a account)) (log “sharing account ~s ~s” c a)(call-next-method))
(defmethod withdraw :around ((c client), (i integer)) ...)
(defmethod credit :around ((c client), (i integer)) ...)
CLOS: before, after, around
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
log sensitive operations = crosscutting concern
tangling & scattering-- maintainability-- reusability-- readability
!
CLOS: before, after, around
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
log sensitive operations = crosscutting concern
tangling & scattering-- maintainability-- reusability-- readability
!Aspect-Oriented Programming
CLOS: before, after, around
Aspect
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
log sensitive operations = crosscutting concern
tangling & scattering-- maintainability-- reusability-- readability
!Aspect-Oriented Programming
CLOS: before, after, around
Aspect
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
log sensitive operations = crosscutting concern
tangling & scattering-- maintainability-- reusability-- readability
!Aspect-Oriented Programming
“at each sensitive method call,
CLOS: before, after, around
Aspect
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
log sensitive operations = crosscutting concern
tangling & scattering-- maintainability-- reusability-- readability
!Aspect-Oriented Programming
make a log entry”
“at each sensitive method call,
CLOS: before, after, around
Aspect
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
log sensitive operations = crosscutting concern
tangling & scattering-- maintainability-- reusability-- readability
!Aspect-Oriented Programming
pointcut
make a log entry”
“at each sensitive method call,
CLOS: before, after, around
Aspect
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
log sensitive operations = crosscutting concern
tangling & scattering-- maintainability-- reusability-- readability
!Aspect-Oriented Programming
pointcut
make a log entry”advice
“at each sensitive method call,
CLOS: before, after, around
Aspect
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
log sensitive operations = crosscutting concern
tangling & scattering-- maintainability-- reusability-- readability
!Aspect-Oriented Programming
pointcut
make a log entry”advice
“at each sensitive method call,
(defmethod shareAccount :around ((c client), (a account)) (log “sharing account ~s ~s” c a)(call-next-method))
(defmethod withdraw :around ((c client), (i integer)) ...)
(defmethod credit :around ((c client), (i integer)) ...)
CLOS: before, after, around
Aspect
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
log sensitive operations = crosscutting concern
tangling & scattering-- maintainability-- reusability-- readability
!Aspect-Oriented Programming
pointcut
make a log entry”advice
“at each sensitive method call,
CLOS: before, after, around
Aspect
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
log sensitive operations = crosscutting concern
tangling & scattering-- maintainability-- reusability-- readability
! ?macros
Aspect-Oriented Programming
pointcut
make a log entry”advice
“at each sensitive method call,
CLOS: before, after, around
Aspect
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
log sensitive operations = crosscutting concern
tangling & scattering-- maintainability-- reusability-- readability
! -- current join point only?macros
Aspect-Oriented Programming
pointcut
make a log entry”advice
“at each sensitive method call,
CLOS: before, after, around
Aspect
Scattering & tanglingTyranny of the dominant decomposition
BankClient
Account
withdraw(AccountNr, Integer)credit(AccountNr, Integer)view(AccountNr)
1 *
*
*
register(Client)createAccount(Client)shareAccount(Client, Account)login(Client)logout(Client)
withdraw(Client, Integer)credit(Client, Integer)transfer(Client, Account)view(Client)
log sensitive operations = crosscutting concern
tangling & scattering-- maintainability-- reusability-- readability
! -- current join point only?macros
! history of join points
Aspect-Oriented Programming
pointcut
make a log entry”advice
“at each sensitive method call,
Declarative Meta Programming & Aspect-Oriented Programming
base)
Declarative Meta Programming & Aspect-Oriented Programming
(base base)
Declarative Meta Programming & Aspect-Oriented Programming
(base base)(meta base))
Declarative Meta Programming & Aspect-Oriented Programming
(base base)(meta base))
meta language object language meta modelMP
Declarative Meta Programming & Aspect-Oriented Programming
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
Declarative Meta Programming & Aspect-Oriented Programming
SOUL for DMP:Base code to facts -> Image queryingSymbiosis (quasiquoting)Rule abstraction (Libraries)Generating codeDetecting/Verifying coding patterns
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
Declarative Meta Programming & Aspect-Oriented Programming
(defclass account () ((balance)))(defclass client () ((id)))(defmethod withdraw ((a account) nr) (setf (balance a) (- (balance a) nr)))(defmethod credit ((a account) nr) ...)
SOUL for DMP:Base code to facts -> Image queryingSymbiosis (quasiquoting)Rule abstraction (Libraries)Generating codeDetecting/Verifying coding patterns
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
Declarative Meta Programming & Aspect-Oriented Programming
(defclass account () ((balance)))(defclass client () ((id)))(defmethod withdraw ((a account) nr) (setf (balance a) (- (balance a) nr)))(defmethod credit ((a account) nr) ...)
SOUL for DMP:Base code to facts -> Image queryingSymbiosis (quasiquoting)Rule abstraction (Libraries)Generating codeDetecting/Verifying coding patterns
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
Declarative Meta Programming & Aspect-Oriented Programming
(defclass account () ((balance)))(defclass client () ((id)))(defmethod withdraw ((a account) nr) (setf (balance a) (- (balance a) nr)))(defmethod credit ((a account) nr) ...)
class(‘account , <account>)classImplementsMethodNamed(<account> ,‘withdraw, <withdraw>)method(<account>, <withdraw>)methodName(<withdraw>, ‘withdraw)methodArguments(<withdraw>, ())methodStatements(<withdraw>, ((setf (balance a) (- (balance a) nr))))...
SOUL for DMP:Base code to facts -> Image queryingSymbiosis (quasiquoting)Rule abstraction (Libraries)Generating codeDetecting/Verifying coding patterns
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
Declarative Meta Programming & Aspect-Oriented Programming
(defclass account () ((balance)))(defclass client () ((id)))(defmethod withdraw ((a account) nr) (setf (balance a) (- (balance a) nr)))(defmethod credit ((a account) nr) ...)
class(‘account , <account>)classImplementsMethodNamed(<account> ,‘withdraw, <withdraw>)method(<account>, <withdraw>)methodName(<withdraw>, ‘withdraw)methodArguments(<withdraw>, ())methodStatements(<withdraw>, ((setf (balance a) (- (balance a) nr))))...
abstractClassHeuristic() if forall(abstractClass(?C),baseClass(?C)), forall(baseClass(?C),abstractClass(?C)).
SOUL for DMP:Base code to facts -> Image queryingSymbiosis (quasiquoting)Rule abstraction (Libraries)Generating codeDetecting/Verifying coding patterns
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
Declarative Meta Programming & Aspect-Oriented Programming
(defclass account () ((balance)))(defclass client () ((id)))(defmethod withdraw ((a account) nr) (setf (balance a) (- (balance a) nr)))(defmethod credit ((a account) nr) ...)
class(‘account , <account>)classImplementsMethodNamed(<account> ,‘withdraw, <withdraw>)method(<account>, <withdraw>)methodName(<withdraw>, ‘withdraw)methodArguments(<withdraw>, ())methodStatements(<withdraw>, ((setf (balance a) (- (balance a) nr))))...
abstractClassHeuristic() if forall(abstractClass(?C),baseClass(?C)), forall(baseClass(?C),abstractClass(?C)).
SOUL for DMP:Base code to facts -> Image queryingSymbiosis (quasiquoting)Rule abstraction (Libraries)Generating codeDetecting/Verifying coding patterns
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
compute
Declarative Meta Programming & Aspect-Oriented Programming
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
Declarative Meta Programming & Aspect-Oriented Programming
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
CARMA: AOP with a SOULmodularizing scattered & tangled codeJoin point type predicatesLink to shadowsSymbiosisLoose coupling aspect/basePattern-based pointcuts
Declarative Meta Programming & Aspect-Oriented Programming
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
(defclass account () ...)(defmethod withdraw ((a account) nr) (setf (balance a) (- (balance a) nr)))(defmethod credit ((a account) nr) ...)(withdraw *account* 3)(print (get-value *account* ‘balance))
CARMA: AOP with a SOULmodularizing scattered & tangled codeJoin point type predicatesLink to shadowsSymbiosisLoose coupling aspect/basePattern-based pointcuts
Declarative Meta Programming & Aspect-Oriented Programming
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
(defclass account () ...)(defmethod withdraw ((a account) nr) (setf (balance a) (- (balance a) nr)))(defmethod credit ((a account) nr) ...)(withdraw *account* 3)(print (get-value *account* ‘balance))
CARMA: AOP with a SOULmodularizing scattered & tangled codeJoin point type predicatesLink to shadowsSymbiosisLoose coupling aspect/basePattern-based pointcuts
Declarative Meta Programming & Aspect-Oriented Programming
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
class(‘account , <account>)classImplementsMethodNamed(<account> ,‘withdraw, <withdraw>)send(<jp>, withdraw, [<account>])assignment(<jp>, balance, 10, 7)reference(<jp2>, balance, 7)
1.
2.
(defclass account () ...)(defmethod withdraw ((a account) nr) (setf (balance a) (- (balance a) nr)))(defmethod credit ((a account) nr) ...)(withdraw *account* 3)(print (get-value *account* ‘balance))
CARMA: AOP with a SOULmodularizing scattered & tangled codeJoin point type predicatesLink to shadowsSymbiosisLoose coupling aspect/basePattern-based pointcuts
Declarative Meta Programming & Aspect-Oriented Programming
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
class(‘account , <account>)classImplementsMethodNamed(<account> ,‘withdraw, <withdraw>)send(<jp>, withdraw, [<account>])assignment(<jp>, balance, 10, 7)reference(<jp2>, balance, 7)
1.
2.
(defclass account () ...)(defmethod withdraw ((a account) nr) (setf (balance a) (- (balance a) nr)))(defmethod credit ((a account) nr) ...)(withdraw *account* 3)(print (get-value *account* ‘balance))
CARMA: AOP with a SOULmodularizing scattered & tangled codeJoin point type predicatesLink to shadowsSymbiosisLoose coupling aspect/basePattern-based pointcuts
carma pointcut
Declarative Meta Programming & Aspect-Oriented Programming
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
rule abstraction,unification,recursion
class(‘account , <account>)classImplementsMethodNamed(<account> ,‘withdraw, <withdraw>)send(<jp>, withdraw, [<account>])assignment(<jp>, balance, 10, 7)reference(<jp2>, balance, 7)
1.
2.
(defclass account () ...)(defmethod withdraw ((a account) nr) (setf (balance a) (- (balance a) nr)))(defmethod credit ((a account) nr) ...)(withdraw *account* 3)(print (get-value *account* ‘balance))
CARMA: AOP with a SOULmodularizing scattered & tangled codeJoin point type predicatesLink to shadowsSymbiosisLoose coupling aspect/basePattern-based pointcuts
carma pointcut
Declarative Meta Programming & Aspect-Oriented Programming
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
rule abstraction,unification,recursion
class(‘account , <account>)classImplementsMethodNamed(<account> ,‘withdraw, <withdraw>)send(<jp>, withdraw, [<account>])assignment(<jp>, balance, 10, 7)reference(<jp2>, balance, 7)
1.
2.
(defclass account () ...)(defmethod withdraw ((a account) nr) (setf (balance a) (- (balance a) nr)))(defmethod credit ((a account) nr) ...)(withdraw *account* 3)(print (get-value *account* ‘balance))
reusability,reasoning
CARMA: AOP with a SOULmodularizing scattered & tangled codeJoin point type predicatesLink to shadowsSymbiosisLoose coupling aspect/basePattern-based pointcuts
carma pointcut
Declarative Meta Programming & Aspect-Oriented Programming
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
rule abstraction,unification,recursion
class(‘account , <account>)classImplementsMethodNamed(<account> ,‘withdraw, <withdraw>)send(<jp>, withdraw, [<account>])assignment(<jp>, balance, 10, 7)reference(<jp2>, balance, 7)
1.
2.
(defclass account () ...)(defmethod withdraw ((a account) nr) (setf (balance a) (- (balance a) nr)))(defmethod credit ((a account) nr) ...)(withdraw *account* 3)(print (get-value *account* ‘balance))
reusability,reasoning
Declarative Meta Programming & Aspect-Oriented Programming
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
rule abstraction,unification,recursion
class(‘account , <account>)classImplementsMethodNamed(<account> ,‘withdraw, <withdraw>)send(<jp>, withdraw, [<account>])assignment(<jp>, balance, 10, 7)reference(<jp2>, balance, 7)
1.
2.
(defclass account () ...)(defmethod withdraw ((a account) nr) (setf (balance a) (- (balance a) nr)))(defmethod credit ((a account) nr) ...)(withdraw *account* 3)(print (get-value *account* ‘balance))
reusability,reasoning
HALO: AOP with a memoryTemporal/Stateful pointcuts
Declarative Meta Programming & Aspect-Oriented Programming
(base base)(meta base))
meta language object language
pointcut language
meta model
base language
MP
AOP jp model
rule abstraction,unification,recursion
class(‘account , <account>)classImplementsMethodNamed(<account> ,‘withdraw, <withdraw>)send(<jp>, withdraw, [<account>])assignment(<jp>, balance, 10, 7)reference(<jp2>, balance, 7)
1.
2.
(defclass account () ...)(defmethod withdraw ((a account) nr) (setf (balance a) (- (balance a) nr)))(defmethod credit ((a account) nr) ...)(withdraw *account* 3)(print (get-value *account* ‘balance))
reusability,reasoning
HALO: AOP with a memoryTemporal/Stateful pointcuts
record
VISAMasterCardMasterCard
BoutiqueClothing
Running example
VISAMasterCardMasterCard
BoutiqueClothing
Running example
VISAMasterCardMasterCard
BoutiqueClothing
Running example
VISAMasterCardMasterCard
BoutiqueClothing
Running example
VISAMasterCardMasterCard
BoutiqueClothing
-10%
Running example
VISAMasterCardMasterCard
BoutiqueClothing
-10%
Running example
VISAMasterCardMasterCard
BoutiqueClothing
-10%
Running example
VISAMasterCardMasterCard
BoutiqueClothing
-10%
Running example
VISAMasterCardMasterCard
BoutiqueClothing
Running example
VISAMasterCardMasterCard
BoutiqueClothing
Running example
VISAMasterCardMasterCard
BoutiqueClothing
Running example
VISAMasterCardMasterCard
$
BoutiqueClothing
Running example
VISAMasterCardMasterCard
$
BoutiqueClothing
Running example
VISAMasterCardMasterCard
$
BoutiqueClothing
Running example
1*
Shop Article
Basketlogin(shop,name,pwd)
buy(shop,name,pwd)
checkout()
current-rate(article)set-rate(article, rate)
1
1
1
*
*
* * 1
Basket
User
Promotions
VISAMasterCardMasterCard
$
BoutiqueClothing
Running example
1*
Shop Article
Basketlogin(shop,name,pwd)
buy(shop,name,pwd)
checkout()
current-rate(article)set-rate(article, rate)
1
1
1
*
*
* * 1
Basket
User
Promotions
VISAMasterCardMasterCard
$
BoutiqueClothing
Running example
1*
Shop Article
Basketlogin(shop,name,pwd)
buy(shop,name,pwd)
checkout()
current-rate(article)set-rate(article, rate)
1
1
1
*
*
* * 1
Basket
User
Promotions
VISAMasterCardMasterCard
$
BoutiqueClothing
Running example
1*
Shop Article
Basketlogin(shop,name,pwd)
buy(shop,name,pwd)
checkout()
current-rate(article)set-rate(article, rate)
1
1
1
*
*
* * 1
Basket
User
Promotions
Stateful!!
Mental Model
fact generator
query engine
jp ctr
(defclass user () ((name))(defmethod checkout ((u user)) ...)(defmethod buy ((u user) (a article)) ...)
base
most-recent, all-past, since, cflow
temporal relations
(at ((gf-call checkout ?u) (most-recent (buy ?u ?a))) (log “user ̃s bought ̃s”?u ?a))
aspect
(defrule (buy ?u) (gf-call buy ?u ?a))
rules
TN: (gf-call checkout <user>)TN-1: (gf-call buy <user> <cd>)
jp facts
Join Point Model
(make-instance‘user) (create‘user <kris>)
(checkout <kris>) (gf-call checkout <kris>)
(end-gf-call checkout <kris> nil)
(get-value <kris>‘name) (slot-get <kris>‘name “kris”)
(setf (get-value <kris>‘name) “kris”)
(slot-set <kris>‘name“”“kris”)
CLOS Join Point Facts
Join Point Model
(make-instance‘user) (create‘user <kris>)
(checkout <kris>) (gf-call checkout <kris>)
(end-gf-call checkout <kris> nil)
(get-value <kris>‘name) (slot-get <kris>‘name “kris”)
(setf (get-value <kris>‘name) “kris”)
(slot-set <kris>‘name“”“kris”)
CLOS Join Point Facts
?obj
Join Point Type Predicates
?obj ?name ?val
?oval?obj ?name ?val
?obj?gf-name
?gf-name ?obj ?res
Join Point Model
(make-instance‘user) (create‘user <kris>)
(checkout <kris>) (gf-call checkout <kris>)
(end-gf-call checkout <kris> nil)
(get-value <kris>‘name) (slot-get <kris>‘name “kris”)
(setf (get-value <kris>‘name) “kris”)
(slot-set <kris>‘name“”“kris”)
CLOS Join Point Facts
?obj
Join Point Type Predicates
?obj ?name ?val
?oval?obj ?name ?val
?obj?gf-name
?gf-name ?obj ?res
Extensible ...
(defrule (promotion “25-12-2008”))
Join Point Model
(make-instance‘user) (create‘user <kris>)
(checkout <kris>) (gf-call checkout <kris>)
(end-gf-call checkout <kris> nil)
(get-value <kris>‘name) (slot-get <kris>‘name “kris”)
(setf (get-value <kris>‘name) “kris”)
(slot-set <kris>‘name“”“kris”)
CLOS Join Point Facts
Hybrid Pointcuts
?obj
Join Point Type Predicates
?obj ?name ?val
?oval?obj ?name ?val
?obj?gf-name
?gf-name ?obj ?res
(escape ?name (password ?user))
Extensible ...
(defrule (promotion “25-12-2008”))
(defrule (date ?date) (escape ?date (get-current-time)))
Join Point Model
(make-instance‘user) (create‘user <kris>)
(checkout <kris>) (gf-call checkout <kris>)
(end-gf-call checkout <kris> nil)
(get-value <kris>‘name) (slot-get <kris>‘name “kris”)
(setf (get-value <kris>‘name) “kris”)
(slot-set <kris>‘name“”“kris”)
CLOS Join Point Facts
Hybrid Pointcuts
?obj
Join Point Type Predicates
?obj ?name ?val
?oval?obj ?name ?val
?obj?gf-name
?gf-name ?obj ?res
(escape ?name (password ?user))
Extensible ...
(defrule (promotion “25-12-2008”))
(defrule (date ?date) (escape ?date (get-current-time)))
Join Point Model
(make-instance‘user) (create‘user <kris>)
(checkout <kris>) (gf-call checkout <kris>)
(end-gf-call checkout <kris> nil)
(get-value <kris>‘name) (slot-get <kris>‘name “kris”)
(setf (get-value <kris>‘name) “kris”)
(slot-set <kris>‘name“”“kris”)
CLOS Join Point Facts
Hybrid Pointcuts
?obj
Join Point Type Predicates
?obj ?name ?val
?oval?obj ?name ?val
?obj?gf-name
?gf-name ?obj ?res
(escape ?name (password ?user))
Extensible ...
(defrule (promotion “25-12-2008”))
(defrule (date ?date) (escape ?date (get-current-time)))
Ad-hoccontext-exposure
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
T customer
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
T customer
1.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
T customer
login
1.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
T customer
login
2.1.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
T customer
login buy
2.1.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
T customer
login buy
2.3.
1.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
T customer
logoutlogin buy
2.3.
1.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
T customer
logoutlogin buy
2.3.4.
1.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
T customer
loginlogoutlogin buy
2.3.4.
1.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
T customer
loginlogoutlogin buy
2.3.4.
1.
5.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
T customer
login buylogoutlogin buy
2.3.4.
1.
5.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
T customer
login buylogoutlogin buy
2.3.4.
1.
5.6.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
T customer
login buy buylogoutlogin buy
2.3.4.
1.
5.6.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
T customer
login buy buylogoutlogin buy
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
T customer
login buy checkoutbuylogoutlogin buy
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy checkoutbuylogoutlogin buy
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy checkoutbuylogoutlogin buy
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy checkoutbuylogoutlogin buy
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy buy checkoutbuy logoutlogin
T customer
login buy checkoutbuylogoutlogin buy
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (all-past (gf-call buy ?args2)))
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy buy checkoutbuy logoutlogin
T customer
login buy checkoutbuylogoutlogin buy
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (all-past (gf-call buy ?args2)))
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy buy checkoutbuy logoutlogin
T customer
login buy checkoutbuylogoutlogin buy
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (all-past (gf-call buy ?args2)))
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy buy checkoutbuy logoutlogin
T customer
login buy checkoutbuylogoutlogin buy
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (all-past (gf-call buy ?args2)))
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy buy checkoutbuy logoutlogin
T customer
login buy checkoutbuylogoutlogin buy
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (all-past (gf-call buy ?args2)))
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy buy checkoutbuy logoutlogin
T customer
login buy checkoutbuylogoutlogin buy
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (all-past (gf-call buy ?args2)))
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy buy checkoutbuy logoutlogin
T customer
login buy checkoutbuylogoutlogin buy
T customer
login buy buy checkoutbuy logoutlogin
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (all-past (gf-call buy ?args2)))
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy buy checkoutbuy logoutlogin
T customer
login buy checkoutbuylogoutlogin buy
T customer
login buy buy checkoutbuy logoutlogin
((gf-call checkout ?args) (since (most-recent (gf-call login ?args2)) (all-past (gf-call buy ?args3)
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (all-past (gf-call buy ?args2)))
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy buy checkoutbuy logoutlogin
T customer
login buy checkoutbuylogoutlogin buy
T customer
login buy buy checkoutbuy logoutlogin
((gf-call checkout ?args) (since (most-recent (gf-call login ?args2)) (all-past (gf-call buy ?args3)
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (all-past (gf-call buy ?args2)))
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy buy checkoutbuy logoutlogin
T customer
login buy checkoutbuylogoutlogin buy
T customer
login buy buy checkoutbuy logoutlogin
((gf-call checkout ?args) (since (most-recent (gf-call login ?args2)) (all-past (gf-call buy ?args3)
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (all-past (gf-call buy ?args2)))
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy buy checkoutbuy logoutlogin
T customer
login buy checkoutbuylogoutlogin buy
T customer
login buy buy checkoutbuy logoutlogin
((gf-call checkout ?args) (since (most-recent (gf-call login ?args2)) (all-past (gf-call buy ?args3)
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (all-past (gf-call buy ?args2)))
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy buy checkoutbuy logoutlogin
T customer
login buy checkoutbuylogoutlogin buy
T customer
login buy buy checkoutbuy logoutlogin
((gf-call checkout ?args) (since (most-recent (gf-call login ?args2)) (all-past (gf-call buy ?args3)
2.3.4.
1.
5.6.7.
Temporal Matching(login <shop> <kris>“kris”“kros”)(buy <kris> <jacket>)(logout <kris>)(login <shop> <kris>“kris”“kros”)(buy <kris> <t-shirt>)(buy <kris> <socks>)(checkout <kris>)
((gf-call checkout ?args) (all-past (gf-call buy ?args2)))
((gf-call checkout ?args) (most-recent (gf-call buy ?args2)))
T customer
login buy buy checkoutbuy logoutlogin
T customer
login buy checkoutbuylogoutlogin buy
T customer
login buy buy checkoutbuy logoutlogin
((gf-call checkout ?args) (since (most-recent (gf-call login ?args2)) (all-past (gf-call buy ?args3)
Stateful context-exposure
2.3.4.
1.
5.6.7.
Stateful context-exposure
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
Stateful context-exposure
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
T <kris>
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
T <kris>
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
1.
T <kris>
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.1.
T <kris>
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.
1.
T <kris>
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.
1.
T <kris>
login
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
T <kris>
login
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
T <kris>
login buy
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.
T <kris>
login buy
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
login buy
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(defrule (rate-for ?rate ?article) (escape ?promo (singleton-instance‘promotions) (escape ?rate (discount-rate-for ?promo ?article)))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
“<kris> gets a 0.05% discount on <cd>”
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
“<kris> gets a 0.05% discount on <cd>”
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
“<kris> gets a 0.05% discount on <cd>”
“<kris> gets a 0.05% discount on <cd>”
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
“<kris> gets a 0.05% discount on <cd>”
“<kris> gets a 0.05% discount on <cd>”
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(at ((gf-call buy ?user ?article) (rate-for ?rate ?article) (most-recent (gf-call login ?user _ _ _))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
“<kris> gets a 0.05% discount on <cd>”
“<kris> gets a 0.05% discount on <cd>”
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(at ((gf-call buy ?user ?article) (rate-for ?rate ?article) (most-recent (gf-call login ?user _ _ _))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
“<kris> gets a 0.05% discount on <cd>”
“<kris> gets a 0.05% discount on <cd>”
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(at ((gf-call buy ?user ?article) (rate-for ?rate ?article) (most-recent (gf-call login ?user _ _ _))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
“<kris> gets a 0.05% discount on <cd>”
“<kris> gets a 0.05% discount on <cd>”
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(at ((gf-call buy ?user ?article) (rate-for ?rate ?article) (most-recent (gf-call login ?user _ _ _))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
“<kris> gets a 0.05% discount on <cd>”
“<kris> gets a 0.05% discount on <cd>”
“<kris> gets a 0.05% discount on <cd>”
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(at ((gf-call buy ?user ?article) (rate-for ?rate ?article) (most-recent (gf-call login ?user _ _ _))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
“<kris> gets a 0.05% discount on <cd>”
“<kris> gets a 0.05% discount on <cd>”
“<kris> gets a 0.05% discount on <cd>”
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(at ((gf-call buy ?user ?article) (rate-for ?rate ?article) (most-recent (gf-call login ?user _ _ _))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
“<kris> gets a 0.05% discount on <cd>”
“<kris> gets a 0.05% discount on <cd>”
“<kris> gets a 0.05% discount on <cd>”
“<kris> gets a 0.00% discount on <cd>”
Stateful context-exposure
(at ((gf-call buy ?user ?article) (most-recent (gf-call login ?user _ _ _) (rate-for ?rate ?article))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(at ((gf-call buy ?user ?article) (rate-for ?rate ?article) (most-recent (gf-call login ?user _ _ _))) (format t “̃s gets a ̃s % discount on ̃s”?user ?rate ?article))
(let ((promo (singleton-instance ‘promotions))) (setf (rate-for promo) <cd> 0.05) (login <kris> <shop> “kris””kros”) (buy <kris> <cd>) (setf (rate-for promo) <cd> 0.00) (buy <kris> <cd>)))
2.3.4.
1.
5.6.
T <kris>
buylogin buy
“<kris> gets a 0.05% discount on <cd>”
“<kris> gets a 0.05% discount on <cd>”
“<kris> gets a 0.05% discount on <cd>”
“<kris> gets a 0.00% discount on <cd>”
Stateful context-exposure
Weaver Implementation
fact generator
query engine
jp ctr
(defclass user () ((name))(defmethod checkout ((u user)) ...)(defmethod buy ((u user) (a article)) ...)
base
most-recent, all-past, since, cflow
temporal relations
(at ((gf-call checkout ?u) (most-recent (buy ?u ?a))) (log “user ̃s bought ̃s”?u ?a))
aspect
(defrule (buy ?u) (gf-call buy ?u ?a))
rules
TN: (gf-call checkout <user>)TN-1: (gf-call buy <user> <cd>)
fact base
Weaver Implementation
fact generator
query engine
jp ctr
(defclass user () ((name))(defmethod checkout ((u user)) ...)(defmethod buy ((u user) (a article)) ...)
base
most-recent, all-past, since, cflow
temporal relations
(at ((gf-call checkout ?u) (most-recent (buy ?u ?a))) (log “user ̃s bought ̃s”?u ?a))
aspect
(defrule (buy ?u) (gf-call buy ?u ?a))
rules
TN: (gf-call checkout <user>)TN-1: (gf-call buy <user> <cd>)
fact base
Weaver Implementation
fact generator
query engine
jp ctr
(defclass user () ((name))(defmethod checkout ((u user)) ...)(defmethod buy ((u user) (a article)) ...)
base
most-recent, all-past, since, cflow
temporal relations
(at ((gf-call checkout ?u) (most-recent (buy ?u ?a))) (log “user ̃s bought ̃s”?u ?a))
aspect
(defrule (buy ?u) (gf-call buy ?u ?a))
rules
TN: (gf-call checkout <user>)TN-1: (gf-call buy <user> <cd>)
fact base
* by wrapping class & generic function protocols in CLOS MOP* explicit meta class tagging
Weaver Implementation
fact generator
query engine
jp ctr
(defclass user () ((name))(defmethod checkout ((u user)) ...)(defmethod buy ((u user) (a article)) ...)
base
most-recent, all-past, since, cflow
temporal relations
(at ((gf-call checkout ?u) (most-recent (buy ?u ?a))) (log “user ̃s bought ̃s”?u ?a))
aspect
(defrule (buy ?u) (gf-call buy ?u ?a))
rules
TN: (gf-call checkout <user>)TN-1: (gf-call buy <user> <cd>)
fact base
Weaver Implementation
fact generator
query engine
jp ctr
(defclass user () ((name))(defmethod checkout ((u user)) ...)(defmethod buy ((u user) (a article)) ...)
base
most-recent, all-past, since, cflow
temporal relations
(at ((gf-call checkout ?u) (most-recent (buy ?u ?a))) (log “user ̃s bought ̃s”?u ?a))
aspect
(defrule (buy ?u) (gf-call buy ?u ?a))
rules
TN: (gf-call checkout <user>)TN-1: (gf-call buy <user> <cd>)
fact base
Weaver Implementation
fact generator
query engine
jp ctr
(defclass user () ((name))(defmethod checkout ((u user)) ...)(defmethod buy ((u user) (a article)) ...)
base
most-recent, all-past, since, cflow
temporal relations
(at ((gf-call checkout ?u) (most-recent (buy ?u ?a))) (log “user ̃s bought ̃s”?u ?a))
aspect
(defrule (buy ?u) (gf-call buy ?u ?a))
rules
TN: (gf-call checkout <user>)TN-1: (gf-call buy <user> <cd>)
fact base
* extension of RETE forward chaining, supporting temporal operators + hybrid pointcuts * copy semantics through static analysis
Weaver Implementation
fact generator
query engine
jp ctr
(defclass user () ((name))(defmethod checkout ((u user)) ...)(defmethod buy ((u user) (a article)) ...)
base
most-recent, all-past, since, cflow
temporal relations
(at ((gf-call checkout ?u) (most-recent (buy ?u ?a))) (log “user ̃s bought ̃s”?u ?a))
aspect
(defrule (buy ?u) (gf-call buy ?u ?a))
rules
TN: (gf-call checkout <user>)TN-1: (gf-call buy <user> <cd>)
fact base
Weaver Implementation
fact generator
query engine
jp ctr
(defclass user () ((name))(defmethod checkout ((u user)) ...)(defmethod buy ((u user) (a article)) ...)
base
most-recent, all-past, since, cflow
temporal relations
(at ((gf-call checkout ?u) (most-recent (buy ?u ?a))) (log “user ̃s bought ̃s”?u ?a))
aspect
(defrule (buy ?u) (gf-call buy ?u ?a))
rules
TN: (gf-call checkout <user>)TN-1: (gf-call buy <user> <cd>)
fact base
Weaver Implementation
fact generator
query engine
jp ctr
(defclass user () ((name))(defmethod checkout ((u user)) ...)(defmethod buy ((u user) (a article)) ...)
base
most-recent, all-past, since, cflow
temporal relations
(at ((gf-call checkout ?u) (most-recent (buy ?u ?a))) (log “user ̃s bought ̃s”?u ?a))
aspect
(defrule (buy ?u) (gf-call buy ?u ?a))
rules
TN: (gf-call checkout <user>)TN-1: (gf-call buy <user> <cd>)
fact base
* reducing the join point history dynamically* gbc in RETE based on semantics of temporal operators * results presented @ RV 2007
Backward Chaining vs Rete Forward Chaining
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
Backward Chaining vs Rete Forward Chaining
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)query engine
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
1.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)1.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)1.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)1.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)1.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)1.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)1.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)1.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)1.2.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
1.2.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
1.2.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
1.2.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
1.2.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
1.2.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
1.2.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
1.2.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
1.2.3.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
1.2.3.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
1.2.3.4.
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
1.2.3.4. (4 gf-call‘set-rate <shop> 0.00)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
(5 gf-call‘checkout <kris>)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
(5 gf-call‘checkout <kris>)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
(5 gf-call‘checkout <kris>)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
(5 gf-call‘checkout <kris>)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
(5 gf-call‘checkout <kris>)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
(5 gf-call‘checkout <kris>)
(2 gf-call‘login <kris> <shop>)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
(5 gf-call‘checkout <kris>)
(2 gf-call‘login <kris> <shop>)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
(5 gf-call‘checkout <kris>)
(2 gf-call‘login <kris> <shop>)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
(5 gf-call‘checkout <kris>)
(2 gf-call‘login <kris> <shop>) (escape 0.00 (current-rate <shop>)))
’’On every checkout, give a discount based on the rate at login time’’
) Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
(5 gf-call‘checkout <kris>)
(2 gf-call‘login <kris> <shop>) (escape 0.00 (current-rate <shop>)))
’’On every checkout, give a discount based on the rate at login time’’
)
) Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(4 gf-call‘set-rate <shop> 0.00)
(5 gf-call‘checkout <kris>)
(2 gf-call‘login <kris> <shop>) (escape 0.00 (current-rate <shop>)))
’’On every checkout, give a discount based on the rate at login time’’
)
) Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(discount <kris> 0.00))
(4 gf-call‘set-rate <shop> 0.00)
(5 gf-call‘checkout <kris>)
(2 gf-call‘login <kris> <shop>) (escape 0.00 (current-rate <shop>)))
’’On every checkout, give a discount based on the rate at login time’’
)
) Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)
1.2.3.4.5.
(discount <kris> 0.00))
(4 gf-call‘set-rate <shop> 0.00)
(5 gf-call‘checkout <kris>)
(2 gf-call‘login <kris> <shop>) (escape 0.00 (current-rate <shop>)))
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1. (1 gf-call‘set-rate <shop> 0.05)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1. (1 gf-call‘set-rate <shop> 0.05)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1. (1 gf-call‘set-rate <shop> 0.05)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1. (1 gf-call‘set-rate <shop> 0.05)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1. (1 gf-call‘set-rate <shop> 0.05)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1. (1 gf-call‘set-rate <shop> 0.05)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1. (1 gf-call‘set-rate <shop> 0.05)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.
(1 gf-call‘set-rate <shop> 0.05)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
(2 gf-call‘login <kris> <shop>)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
(2 gf-call‘login <kris> <shop>) (escape 0.05 (current-rate <shop>)))
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
(2 gf-call‘login <kris> <shop>) (escape 0.05 (current-rate <shop>)))
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.3.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)
(2 gf-call‘login <kris> <shop>) (escape 0.05 (current-rate <shop>)))
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.3.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(2 gf-call‘login <kris> <shop>) (escape 0.05 (current-rate <shop>)))
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.3.4.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(2 gf-call‘login <kris> <shop>) (escape 0.05 (current-rate <shop>)))
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.3.4.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)(4 gf-call‘set-rate <shop> 0.00)
(2 gf-call‘login <kris> <shop>) (escape 0.05 (current-rate <shop>)))
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.3.4.5.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)(4 gf-call‘set-rate <shop> 0.00)
(2 gf-call‘login <kris> <shop>) (escape 0.05 (current-rate <shop>)))
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.3.4.5.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)(4 gf-call‘set-rate <shop> 0.00)
(2 gf-call‘login <kris> <shop>) (escape 0.05 (current-rate <shop>)))
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.3.4.5.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)(4 gf-call‘set-rate <shop> 0.00)
(2 gf-call‘login <kris> <shop>) (escape 0.05 (current-rate <shop>)))
(5 gf-call‘checkout <kris>)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.3.4.5.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)(4 gf-call‘set-rate <shop> 0.00)
(2 gf-call‘login <kris> <shop>) (escape 0.05 (current-rate <shop>)))
(5 gf-call‘checkout <kris>)
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining
’’On every checkout, give a discount based on the rate at login time’’
1.2.3.4.5.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)(4 gf-call‘set-rate <shop> 0.00)
(2 gf-call‘login <kris> <shop>) (escape 0.05 (current-rate <shop>)))
(5 gf-call‘checkout <kris>)
(discount <kris> 0.05))
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining Stateful
’’On every checkout, give a discount based on the rate at login time’’
1.2.3.4.5.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)(4 gf-call‘set-rate <shop> 0.00)
(2 gf-call‘login <kris> <shop>) (escape 0.05 (current-rate <shop>)))
(5 gf-call‘checkout <kris>)
(discount <kris> 0.05))
Backward Chaining
Backward Chaining vs Rete Forward Chaining
(gf-call checkout (?user))
(gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))
and
most-recent
?(discount ?user ?rate)
!
query engine
(set-rate *shop* 0.05)(login *kris* *shop*)(buy *kris* *cd*)(set-rate *shop* 0.00)(checkout *kris*)
ReteForward Chaining Stateful
’’On every checkout, give a discount based on the rate at login time’’
1.2.3.4.5.
(1 gf-call‘set-rate <shop> 0.05)(2 gf-call‘login <kris> <shop>)(3 gf-call‘buy <kris> <cd>)
(5 gf-call‘checkout <kris>)(4 gf-call‘set-rate <shop> 0.00)
(2 gf-call‘login <kris> <shop>) (escape 0.05 (current-rate <shop>)))
(5 gf-call‘checkout <kris>)
(discount <kris> 0.05))
Temporal ExtensionsEscape Extension
Reducing Memory Overhead
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop)
(escape ?rate (current-rate ?shop))
most-recent
?(discount ?user ?rate)
escape
T1 ?user
T2 ?user ?shop
T2 ?rate ?user ?shop
T1 ?rate ?user ?shop
(login *kris* *shop*)(buy *kris* *cd*)(checkout *kris*)(login *kris* *shop*)(buy *kris* *dvd*)(checkout *kris*)
Code
Reducing Memory Overhead
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop)
(escape ?rate (current-rate ?shop))
most-recent
?(discount ?user ?rate)
escape
T1 ?user
T2 ?user ?shop
T2 ?rate ?user ?shop
T1 ?rate ?user ?shop
(login *kris* *shop*)(buy *kris* *cd*)(checkout *kris*)(login *kris* *shop*)(buy *kris* *dvd*)(checkout *kris*)
1 <kris> <shop>
3 <kris>
4 <kris> <shop>0.053 <kris> <shop>0.05
6 <kris> <shop>0.05
4 <kris> <shop>
1 <kris> <shop>0.05
6 <kris>
Code
Reducing Memory Overhead
(at ((gf-call checkout (?user)) (most-recent (gf-call login ?user ?shop) (escape ?rate (current-rate ?shop))))(discount ?user ?rate))
(gf-call checkout (?user))
(gf-call login ?user ?shop)
(escape ?rate (current-rate ?shop))
most-recent
?(discount ?user ?rate)
escape
T1 ?user
T2 ?user ?shop
T2 ?rate ?user ?shop
T1 ?rate ?user ?shop
(login *kris* *shop*)(buy *kris* *cd*)(checkout *kris*)(login *kris* *shop*)(buy *kris* *dvd*)(checkout *kris*)
1 <kris> <shop>
3 <kris>
4 <kris> <shop>0.053 <kris> <shop>0.05
6 <kris> <shop>0.05
4 <kris> <shop>
1 <kris> <shop>0.05
6 <kris>
Code LT
[1,1]
[4,4]
LT
[1,4]
[4,..]
LT
[3,3]
[6,6]
LT
[3,3]
[6,6]
DEMO
0 2,000 4,000 6,000 8,000
S3 copy
S3 non copy
S2 copy
S2 non copy
S1 copy
S1 non copy
nr of memorytable entriesstill allocated
total nr ofmemory tableentries evermade
nr ofgenerated joinpoint facts
Reducing Memory Overhead (2)
Escaping with future variables in HALOCharlotte Herzeel, Kris Gybels, Pascal CostanzaIn "Proc. of the Runtime Verification Workshop", 2007
Modularizing crosscuts in an e-commerce application in Lisp using HALOCharlotte Herzeel, Kris Gybels, Pascal Costanza, Theo D’HondtIn "Proc. of the International Lisp Conference", 2007
0 2,000 4,000 6,000 8,000
S3 copy
S3 non copy
S2 copy
S2 non copy
S1 copy
S1 non copy
nr of memorytable entriesstill allocated
total nr ofmemory tableentries evermade
nr ofgenerated joinpoint facts
Reducing Memory Overhead (2)
It helps!
Escaping with future variables in HALOCharlotte Herzeel, Kris Gybels, Pascal CostanzaIn "Proc. of the Runtime Verification Workshop", 2007
Modularizing crosscuts in an e-commerce application in Lisp using HALOCharlotte Herzeel, Kris Gybels, Pascal Costanza, Theo D’HondtIn "Proc. of the International Lisp Conference", 2007
Summary & Future Work• Summary:
• history-based AOP for CLOS ; stateful pointcuts
• temporal logic-based: abstraction & logic variables
• Rete forward chaining-based implementation
• memory reduction
• Future Work:
• language design:
• exploit logic-programming (i.e. unification & recursion)
• exploit temporal logic-programming (mixing temporal logic/advice code)
• before/after ... what about around? (roll-back mechanism)
• reducing memory overhead:
• shadow weaving
Summary & Future Work• Summary:
• history-based AOP for CLOS ; stateful pointcuts
• temporal logic-based: abstraction & logic variables
• Rete forward chaining-based implementation
• memory reduction
• Future Work:
• language design:
• exploit logic-programming (i.e. unification & recursion)
• exploit temporal logic-programming (mixing temporal logic/advice code)
• before/after ... what about around? (roll-back mechanism)
• reducing memory overhead:
• shadow weaving
Thanks for listening!Questions?
Summary & Future Work• Summary:
• history-based AOP for CLOS ; stateful pointcuts
• temporal logic-based: abstraction & logic variables
• Rete forward chaining-based implementation
• memory reduction
• Future Work:
• language design:
• exploit logic-programming (i.e. unification & recursion)
• exploit temporal logic-programming (mixing temporal logic/advice code)
• before/after ... what about around? (roll-back mechanism)
• reducing memory overhead:
• shadow weaving
Thanks for listening!Questions?
http://prog.vub.ac.be/HALO
References
• Supporting Software Development Through Declaratively Codified Programming Patterns, Kim Mens, Isabel Michiels, Roel Wuyts In "Journal on Expert Systems with Applications, Elsevier Publications, pages 405-413, number 4, Volume 23, November", 2002
• Arranging language features for more robust pattern-based crosscutsKris Gybels, Johan Brichau, In "Proceedings of the Second International Conference on Aspect-Oriented Software Development", 2003
• Seamless Integration of Rule-Based Knowledge and Object-Oriented Functionality with Linguistic Symbiosis, Maja D'Hondt, Kris Gybels, Viviane Jonckers, In "Proceedings of the 19th Annual ACM Symposium on Applied Computing (SAC 2004), Special Track on Object-Oriented Programming, Languages and Systems. Nicosia, Cyprus. ACM. March 2004.", 2004
• Context-aware Aspects, Eric Tanter, Kris Gybels, Marcus Denker, Alexandre Bergel, Proceedings of the 5th International Symposium on Software Composition (SC 2006), LNCS 4089, pp.227-249, Springer-Verlag, March 2006, Vienna, Austria
• Expressive Pointcuts for Increased Modularity, Klaus Ostermann and Mira Mezini and Christoph Bockisch, Proceedings of the European Conference on Object-Oriented Programming (ECOOP)
• Modularizing Crosscuts in an E-commerce Application in Lisp using HALO , Charlotte Herzeel, Kris Gybels, Pascal Costanza, Theo D'Hondt , International Lisp Conference 2007
• Escaping with future variables in HALO , Charlotte Herzeel, Kris Gybels, Pascal Costanza, Proceedings of the Runtime Verification Workshop 2007
<instance>
Text
Code
meta
base
titles
highlight
class
T customer
event
Text Text
!
Text
box
TitleAuthorIn "", ????
<instance>
Text
Code
meta
base
titles
highlight
class
T customer
event
Text Text
!
Text
box
TitleAuthorIn "", ????