/* A small (gnu) prolog example on emotional modeling */ /* Timo Honkela, UIAH Media Lab, Nov 11, 1999 */ /* Based on the scheme presented at http://www.brunel.ac.uk/~hsstbbp/emotlec6.htm */ /* Save the files example1.pro to example4.pro into your working directory. Start gnu prolog environment: mlab > gprolog Load the example: ?- [example1]. Set level of activation: ?- set_a(0.8). Set level of pleansantness: ?- set_p(-1.0). Query the state: ?- state(Name, Level). Input semicolon (;) for several answers: there should be three different states with varying levels of strenth. You can experiment by setting different levels of activation and pleasantness. */ /* ======= */ /* PROGRAM */ /* ======= */ /* The user sets the level of pleasantness of the agent */ set_p(Value) :- Value > 1.0, write('Please give values between -1 and 1\n'), !, fail. set_p(Value) :- Value < -1.0, write('Please give values between -1 and 1\n'), !, fail. set_p(Value) :- retract(pleasantness(_)), !, /* if old value exists, retracted */ asserta(pleasantness(Value)). /* new value is set */ set_p(Value) :- asserta(pleasantness(Value)). /* The user sets the level of activation of the agent */ set_a(Value) :- Value > 1.0, write('Please give values between -1 and 1\n'), !, fail. set_a(Value) :- Value < -1.0, write('Please give values between -1 and 1\n'), !, fail. set_a(Value) :- retract(activation(_)), !, asserta(activation(Value)). set_a(Value) :- asserta(activation(Value)). /* State is computed. */ /* The calculations are approximate, i.e., not following in detail the "emotion circle" */ state(stimulated, Z) :- pleasantness(P), activation(A), absolutevalue(P, AbsP), A > (AbsP / 2), Z is A - (AbsP / 2). state(euphoric, Z) :- pleasantness(P), activation(A), A > 0, P > 0, Z is (A + P) / 2.0. state(happy, Z) :- pleasantness(P), activation(A), absolutevalue(A, AbsA), P > (AbsA / 2), Z is P - (AbsA / 2). state(serene, Z) :- pleasantness(P), activation(A), A < 0, P > 0, Z is (P - A) / 2.0. state(passive, Z) :- pleasantness(P), activation(A), absolutevalue(P, AbsP), A < -1 * (AbsP / 2), Z is (-1 * A) - (AbsP / 2). state(bored, Z) :- pleasantness(P), activation(A), A < 0, P < 0, Z is ((-1 * P) - A) / 2.0. state(sad, Z) :- pleasantness(P), activation(A), absolutevalue(A, AbsA), P < -1 * (AbsA / 2), Z is (-1 * P) - (AbsA / 2). state(anxious, Z) :- pleasantness(P), activation(A), A > 0, P < 0, Z is (A - P) / 2.0. state(_,_). /* calculate the absolute value */ /* e.g. if X = -2.3 then AbsX becomes 2.3 */ absolutevalue(X, AbsX) :- X < 0, AbsX is -1 * X, !. absolutevalue(X, X).