go1 :- initialize(count),member(2, [1,2,3]), get_value(count,X), printf("Count is: %\n", [X]). /* go2 assumes count has been initialized */ go2 :- member(a, [b, c, d]). /* try this: go1. go2. get_value(count, X). */ member(Item, [Item|Tail]) :- increment(count). member(Item, [Head|Tail]) :- increment(count), member(Item, Tail). /* Create the von Neumann variable 'Var' and initialize it to 0 Notes: The 'dynamic' statement is required to allow for retraction. 'initialize' creates a new rule of the form: von_Nuemann_store(Var, 0) :- true. The reason we use this form, rather than simply 'von_Nuemann_store(Var,0).' is that in 'increment' and 'set_value', we use the 'rule' predicate to search for the current rule defining the value of Var, and the 'rule' predicate requires a head and a body. */ initialize(Var) :- dynamic(von_Nuemann_store,2), retractall(von_Nuemann_store(Var,Value)), assert(von_Nuemann_store(Var, 0):-true). /* add one to von Neumann variable 'Var' */ increment(Var) :- rule(von_Nuemann_store(Var, Value),true), retract(von_Nuemann_store(Var, Value):-true), NewValue = Value+1, assert(von_Nuemann_store(Var, NewValue):-true). /* set value of von Neumann variable 'Var' to 'NewValue' */ set_value(Var, NewValue) :- rule(von_Nuemann_store(Var, Value),true), retract(von_Nuemann_store(Var, Value):-true), assert(von_Nuemann_store(Var, NewValue):-true). /* get value of von Neumann variable 'Var' returning it in 'Value' */ get_value(Var, Value) :- von_Nuemann_store(Var, Value).