forward chaining in halo

Post on 25-May-2015

314 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

Forward Chaining in HALO An Implementation Strategy for History-based Logic Pointcuts. Charlotte Herzeel, Kris Gybels, Pascal Costanza, Coen De Roover and Theo D’hondt. ESUG 2007, Lugano

TRANSCRIPT

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 "", ????

top related