/* 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 */ /* Added: setting linguistic approximations of fuzzy values */ /* Linguistic approximations */ /* pleasantness */ set_p_fuzzy(very_high) :- set_p(1.0). set_p_fuzzy(quite_high) :- set_p(0.7). set_p_fuzzy(a_little_high) :- set_p(0.3). set_p_fuzzy(very_low) :- set_p(-1.0). set_p_fuzzy(quite_low) :- set_p(-0.7). set_p_fuzzy(a_little_low) :- set_p(-0.3). /* activation */ set_a_fuzzy(very) :- set_a(1.0). set_a_fuzzy(quite) :- set_a(0.7). set_a_fuzzy(little) :- set_a(0.3). set_a_fuzzy(very_low) :- set_a(-1.0). set_a_fuzzy(quite_low) :- set_a(-0.7). set_a_fuzzy(a_little_low) :- set_a(-0.3). /* Ask about the situation and give the result as a list */ what(List) :- findall(valuepair(X, Y), state(X, Y), List). /* 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. /* 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).