diff --git a/Logtalk/examples/threads/NOTES.txt b/Logtalk/examples/threads/NOTES.txt
new file mode 100644
index 000000000..e55213702
--- /dev/null
+++ b/Logtalk/examples/threads/NOTES.txt
@@ -0,0 +1,13 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+This folder contains some examples of multi-threading programming.
+Multi-threading programming is only supported on some Prolog compilers.
+Currently this includes SWI-Prolog and YAP. Moreover, multi-threading
+is turned off by default. In order to run the examples, you will need
+to first turn on multi-threading support on the Prolog config files.
diff --git a/Logtalk/examples/threads/atomic/NOTES.txt b/Logtalk/examples/threads/atomic/NOTES.txt
new file mode 100644
index 000000000..addf85e1e
--- /dev/null
+++ b/Logtalk/examples/threads/atomic/NOTES.txt
@@ -0,0 +1,19 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+To load this example and for sample queries, please see the SCRIPT file.
+
+This folder contains a simple multi-threading example illustrating the
+use of the "atomic" option on threaded_call/2 calls to cope with methods
+that have side-effects.
+
+The object defined in the example source file, "atomic.lgt", defines a
+predicate named waste_time/0 that is used to delay the execuion of goals
+in order to better illustrate the semantics of the "atomic" option. This
+predicate uses a counter that you might need to adjust, depending on your
+Prolog compiler and computer performance.
diff --git a/Logtalk/examples/threads/atomic/SCRIPT.txt b/Logtalk/examples/threads/atomic/SCRIPT.txt
new file mode 100644
index 000000000..3ffcef73c
--- /dev/null
+++ b/Logtalk/examples/threads/atomic/SCRIPT.txt
@@ -0,0 +1,71 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+% start by loading the loading the example:
+
+| ?- logtalk_load(atomic(loader)).
+...
+
+
+% send three asynchronous messages whose corresponding methods perform output operations:
+
+| ?- threaded_call(nasty1::io(alpha), [noreply]), threaded_call(nasty1::io(digit), [noreply]), threaded_call(nasty1::io(alpha), [noreply]).
+
+a0ab1bc2c3ddefef45gg6hh7ii8jkjk9
+llmmnnopopqqrrsstztzyyxxwwuv
+uv
+
+Yes
+
+
+% the same three asynchronous messages but making them atomic for the receiver object:
+
+| ?- threaded_call(nasty1::io(alpha), [atomic, noreply]), threaded_call(nasty1::io(digit), [atomic, noreply]), threaded_call(nasty1::io(alpha), [atomic, noreply]).
+
+abcdefghijklmnopqrstzyxwuv
+0123456789
+abcdefghijklmnopqrstzyxwuv
+
+Yes
+
+
+% send three asynchronous messages whose corresponding methods perform database updates
+% (this may or may not work, most likely will throw an exception):
+
+| ?- threaded_call(nasty1::update_db(_), [noreply]), threaded_call(nasty1::update_db(_), [noreply]), threaded_call(nasty1::update_db(_), [noreply]).
+
+No
+
+
+% the same three asynchronous messages but making them atomic for the receiver object
+% (this should always work):
+
+| ?- threaded_call(nasty1::update_db(_), [atomic, noreply]), threaded_call(nasty1::update_db(_), [atomic, noreply]), threaded_call(nasty1::update_db(_), [atomic, noreply]).
+
+Yes
+
+
+% a better solution is to declare predicates that need to be thread syncronized as "atomic",
+% as exemplified in object "nasty2":
+
+| ?- nasty2::(io(alpha), io(digit), io(alpha)).
+
+abcdefghijklmnopqrstzyxwuv
+0123456789
+abcdefghijklmnopqrstzyxwuv
+
+Yes
+
+
+| ?- nasty2::(update_db(X), update_db(Y), update_db(Z)).
+
+X = 1
+Y = 2
+Z = 3
+
+Yes
diff --git a/Logtalk/examples/threads/atomic/atomic.lgt b/Logtalk/examples/threads/atomic/atomic.lgt
new file mode 100644
index 000000000..3475912a4
--- /dev/null
+++ b/Logtalk/examples/threads/atomic/atomic.lgt
@@ -0,0 +1,121 @@
+
+:- object(nasty1).
+
+ :- info([
+ version is 1.0,
+ author is 'Paulo Moura',
+ date is 2006/04/14,
+ comment is 'Simple example for using the "atomic" option for multi-threading calls with side-effects.']).
+
+ :- threaded.
+
+ :- public(update_db/1).
+ :- mode(update_db(-integer), one).
+ :- info(update_db/1, [
+ comment is 'Perform a database update with a long delay between retracting the old information and asserting the new one.',
+ argnames is ['New']]).
+
+ :- private(db/1).
+ :- dynamic(db/1).
+
+ :- public(io/1).
+ :- mode(io(+atom), one).
+ :- info(io/1, [
+ comment is 'Write some characters to the standard output stream with a long delay between each write operation.',
+ argnames is ['Chars']]).
+
+ db(0).
+
+ update_db(New) :-
+ retract(db(Old)),
+ waste_time,
+ New is Old + 1,
+ waste_time,
+ assertz(db(New)).
+
+ io(alpha) :-
+ write(a), waste_time, write(b), waste_time, write(c), waste_time, write(d), waste_time, write(e),
+ write(f), waste_time, write(g), waste_time, write(h), waste_time, write(i), waste_time, write(j),
+ write(k), waste_time, write(l), waste_time, write(m), waste_time, write(n), waste_time, write(o),
+ write(p), waste_time, write(q), waste_time, write(r), waste_time, write(s), waste_time, write(t),
+ write(z), waste_time, write(y), waste_time, write(x), waste_time, write(w), waste_time, write(u),
+ write(v), nl.
+
+ io(digit) :-
+ write(0), waste_time, write(1), waste_time, write(2), waste_time, write(3), waste_time, write(4),
+ write(5), waste_time, write(6), waste_time, write(7), waste_time, write(8), waste_time, write(9), nl.
+
+ waste_time :-
+ between(1, 10000, _),
+ fail.
+ waste_time.
+
+ between(Lower, _, Lower).
+ between(Lower, Upper, Integer) :-
+ Lower < Upper,
+ Next is Lower + 1,
+ between(Next, Upper, Integer).
+
+:- end_object.
+
+
+:- object(nasty2).
+
+ :- info([
+ version is 1.0,
+ author is 'Paulo Moura',
+ date is 2006/04/14,
+ comment is 'Simple example for using the "atomic" option for multi-threading calls with side-effects.']).
+
+ :- threaded.
+
+ :- public(update_db/1).
+ :- atomic(update_db/1).
+ :- mode(update_db(-integer), one).
+ :- info(update_db/1, [
+ comment is 'Perform a database update with a long delay between retracting the old information and asserting the new one.',
+ argnames is ['New']]).
+
+ :- private(db/1).
+ :- dynamic(db/1).
+
+ :- public(io/1).
+ :- atomic(io/1).
+ :- mode(io(+atom), one).
+ :- info(io/1, [
+ comment is 'Write some characters to the standard output stream with a long delay between each write operation.',
+ argnames is ['Chars']]).
+
+ db(0).
+
+ update_db(New) :-
+ retract(db(Old)),
+ waste_time,
+ New is Old + 1,
+ waste_time,
+ assertz(db(New)).
+
+ io(alpha) :-
+ write(a), waste_time, write(b), waste_time, write(c), waste_time, write(d), waste_time, write(e),
+ write(f), waste_time, write(g), waste_time, write(h), waste_time, write(i), waste_time, write(j),
+ write(k), waste_time, write(l), waste_time, write(m), waste_time, write(n), waste_time, write(o),
+ write(p), waste_time, write(q), waste_time, write(r), waste_time, write(s), waste_time, write(t),
+ write(z), waste_time, write(y), waste_time, write(x), waste_time, write(w), waste_time, write(u),
+ write(v), nl.
+
+ io(digit) :-
+ write(0), waste_time, write(1), waste_time, write(2), waste_time, write(3), waste_time, write(4),
+ write(5), waste_time, write(6), waste_time, write(7), waste_time, write(8), waste_time, write(9), nl.
+
+ waste_time :-
+ between(1, 100000, _),
+ fail.
+ waste_time.
+
+ between(Lower, _, Lower).
+ between(Lower, Upper, Integer) :-
+ Lower < Upper,
+ Next is Lower + 1,
+ between(Next, Upper, Integer).
+
+:- end_object.
diff --git a/Logtalk/examples/threads/atomic/loader.lgt b/Logtalk/examples/threads/atomic/loader.lgt
new file mode 100644
index 000000000..d76562fe7
--- /dev/null
+++ b/Logtalk/examples/threads/atomic/loader.lgt
@@ -0,0 +1,13 @@
+
+:- initialization(
+ logtalk_load(
+ atomic)).
+
+/*
+If you intend to use the FOP XSL:FO processor for generating PDF documenting
+files, comment the directive above and uncomment the directive below
+
+:- initialization(
+ logtalk_load(
+ atomic, [xmlsref(standalone)])).
+*/
diff --git a/Logtalk/examples/threads/birthdays/NOTES.txt b/Logtalk/examples/threads/birthdays/NOTES.txt
new file mode 100644
index 000000000..8da690f9a
--- /dev/null
+++ b/Logtalk/examples/threads/birthdays/NOTES.txt
@@ -0,0 +1,12 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+To load this example and for sample queries, please see the SCRIPT file.
+
+This folder contains a simple multi-threading example with agents and
+their birthdays.
diff --git a/Logtalk/examples/threads/birthdays/SCRIPT.txt b/Logtalk/examples/threads/birthdays/SCRIPT.txt
new file mode 100644
index 000000000..526d86e86
--- /dev/null
+++ b/Logtalk/examples/threads/birthdays/SCRIPT.txt
@@ -0,0 +1,52 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+% start by loading the "event_handlersp" protocol:
+
+| ?- logtalk_load(library(event_handlersp)).
+...
+
+
+% now you are ready for loading the example:
+
+| ?- logtalk_load(birthdays(loader)).
+...
+
+
+% create two new agents, Paul and Nathalie:
+
+| ?- agent::(new(paul, 40, male), new(nathalie, 32, female)).
+
+Yes
+
+
+% make them friends:
+
+| ?- paul::new_friend(nathalie).
+
+Yes
+
+
+% it's birthday for Nathalie:
+
+| ?- nathalie::birthday.
+
+Happy birthday from paul!
+Thanks! Here, have a slice of cake, paul.
+Thanks for the cake nathalie!
+
+Yes
+
+
+% tell Paul to ask Nathalie her age:
+
+| ?- paul::ask_age(nathalie, Age).
+
+Age = 33
+
+Yes
diff --git a/Logtalk/examples/threads/birthdays/birthdays.lgt b/Logtalk/examples/threads/birthdays/birthdays.lgt
new file mode 100644
index 000000000..c981591ab
--- /dev/null
+++ b/Logtalk/examples/threads/birthdays/birthdays.lgt
@@ -0,0 +1,90 @@
+
+:- object(agent,
+ implements(event_handlersp)).
+
+ :- info([
+ version is 1.0,
+ author is 'Peter Robinson and Paulo Moura',
+ date is 2006/04/09,
+ comment is 'Simple multi-threading example with agents and their birthdays.']).
+
+ :- threaded.
+
+ :- public(new/3).
+ :- mode(new(+atom, +integer, +atom), one).
+ :- info(new/3, [
+ comment is 'Creates a new agent given its name, age, and gender.',
+ argnames is ['Name', 'Age', 'Gender']]).
+
+ :- public(age/1).
+ :- dynamic(age/1).
+ :- mode(age(?integer), zero_or_one).
+ :- info(age/1, [
+ comment is 'Agent age.']).
+
+ :- public(ask_age/2).
+ :- mode(ask_age(+atom, ?integer), zero_or_one).
+ :- info(ask_age/2, [
+ comment is 'Ask a friend his/her age.',
+ argnames is ['Name', 'Age']]).
+
+ :- public(gender/1).
+ :- dynamic(gender/1).
+ :- mode(gender(?integer), zero_or_one).
+ :- info(gender/1, [
+ comment is 'Agent gender.']).
+
+ :- public(birthday/0).
+ :- mode(birthday, one).
+ :- info(birthday/0, [
+ comment is 'Increments an agent age, an unfortunate side-effect of its birthday.']).
+
+ :- public(happy_birthday/1).
+ :- mode(happy_birthday(+object_identifier), one).
+ :- info(happy_birthday/1, [
+ comment is 'Happy birthday message from a friend.',
+ argnames is ['From']]).
+
+ :- public(cake_slice/1).
+ :- mode(cake_slice(+object_identifier), one).
+ :- info(cake_slice/1, [
+ comment is 'Offer a slice of birthday cake to a friend.',
+ argnames is ['From']]).
+
+ :- public(new_friend/1).
+ :- mode(new_friend(+object_identifier), one).
+ :- info(new_friend/1, [
+ comment is 'New friend, watch out for his/her birthday.',
+ argnames is ['Name']]).
+
+ new(Name, Age, Gender) :-
+ this(This),
+ create_object(Name, [extends(This)], [threaded], [age(Age), gender(Gender)]).
+
+ ask_age(Friend, Age) :-
+ threaded_call(Friend::age(Age)),
+ threaded_exit(Friend::age(Age)).
+
+ birthday :-
+ ::retract(age(Old)),
+ New is Old + 1,
+ ::assertz(age(New)).
+
+ happy_birthday(From) :-
+ self(Self),
+ write('Happy birthday from '), write(From), write('!'), nl,
+ write('Thanks! Here, have a slice of cake, '), write(From), write('.'), nl,
+ threaded_call(From::cake_slice(Self), [noreply]).
+
+ cake_slice(From) :-
+ write('Thanks for the cake '), write(From), write('!'), nl.
+
+ new_friend(Friend) :-
+ self(Self),
+ define_events(after, Friend, birthday, _, Self).
+
+ after(Friend, birthday, _) :-
+ self(Self),
+ threaded_call(Friend::happy_birthday(Self), [noreply]).
+
+:- end_object.
diff --git a/Logtalk/examples/threads/birthdays/loader.lgt b/Logtalk/examples/threads/birthdays/loader.lgt
new file mode 100644
index 000000000..53feda1de
--- /dev/null
+++ b/Logtalk/examples/threads/birthdays/loader.lgt
@@ -0,0 +1,13 @@
+
+:- initialization(
+ logtalk_load(
+ [birthdays], [events(on)])).
+
+/*
+If you intend to use the FOP XSL:FO processor for generating PDF documenting
+files, comment the directive above and uncomment the directive below
+
+:- initialization(
+ logtalk_load(
+ [birthdays], [events(on), xmlsref(standalone)])).
+*/
diff --git a/Logtalk/examples/threads/functions/NOTES.txt b/Logtalk/examples/threads/functions/NOTES.txt
new file mode 100644
index 000000000..ea63e0b40
--- /dev/null
+++ b/Logtalk/examples/threads/functions/NOTES.txt
@@ -0,0 +1,14 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+To load this example and for sample queries, please see the SCRIPT file.
+
+This folder contains a simple multi-threading example illustrating how
+to create threads for competing goals, which one performing the same
+task using diferent methods. The first goal to complete leads to the
+immediate termination of the threads running the remaining goals.
diff --git a/Logtalk/examples/threads/functions/SCRIPT.txt b/Logtalk/examples/threads/functions/SCRIPT.txt
new file mode 100644
index 000000000..5399f1b9a
--- /dev/null
+++ b/Logtalk/examples/threads/functions/SCRIPT.txt
@@ -0,0 +1,65 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+% start by loading the loading the example:
+
+| ?- logtalk_load(functions(loader)).
+...
+
+
+% find the roots of some functions using each one of provided methods:
+
+| ?- bisection::find_root(f1, 1.0, 2.3, 1e-15, Zero).
+
+Zero = 2.0
+yes
+
+| ?- newton::find_root(f1, 1.0, 2.3, 1e-15, Zero).
+
+Zero = 2.0
+yes
+| ?- muller::find_root(f1, 1.0, 2.3, 1e-15, Zero).
+
+Zero = 2.0
+yes
+
+| ?- bisection::find_root(f2, 1.0, 1.3, 1e-15, Zero).
+
+Zero = 1.25809265664599
+yes
+
+| ?- newton::find_root(f2, 1.0, 1.3, 1e-15, Zero).
+
+Zero = 1.25809265664599
+yes
+
+| ?- muller::find_root(f2, 1.0, 1.3, 1e-15, Zero).
+
+Zero = 1.25809265664599
+yes
+
+
+% find the roots of some functions running all methods at once using multi-threading:
+
+| ?- function_root::find_root(f1, 1.0, 2.3, 1e-15, Zero, Method).
+
+Zero = 2.0
+Method = bisection
+yes
+
+| ?- function_root::find_root(f2, 1.0, 1.3, 1e-15, Zero, Method).
+
+Zero = 1.25809265664599
+Method = newton
+yes
+
+| ?- function_root::find_root(f3, 0.0, 3.0, 1e-15, Zero, Method).
+
+Zero = 1.4142135623731
+Method = newton
+yes
diff --git a/Logtalk/examples/threads/functions/functions.lgt b/Logtalk/examples/threads/functions/functions.lgt
new file mode 100644
index 000000000..369caf59d
--- /dev/null
+++ b/Logtalk/examples/threads/functions/functions.lgt
@@ -0,0 +1,268 @@
+
+:- protocol(find_rootp).
+
+ :- info([
+ version is 1.0,
+ date is 2006/4/21,
+ author is 'Paulo Nunes',
+ comment is 'Default protocol for root find algorithms.']).
+
+ :- public(find_root/5).
+ :- mode(find_root(+object_identifier, +float, +float, +float, -float), one).
+ :- info(find_root/5, [
+ comment is 'Find the root of a function in the interval [A, B] given a maximum aproximation error.',
+ argnames is ['Function', 'A', 'B', 'Error', 'Zero']]).
+
+ :- public(find_root/6).
+ :- mode(find_root(+object_identifier, +float, +float, +float, -float, -object_identifier), one).
+ :- info(find_root/6, [
+ comment is 'Find the root of a function in the interval [A, B] given a maximum aproximation error. Return the method used.',
+ argnames is ['Function', 'A', 'B', 'Error', 'Zero', 'Method']]).
+
+:- end_protocol.
+
+
+:- protocol(functionp).
+
+ :- info([
+ version is 1.0,
+ date is 2006/4/21,
+ author is 'Paulo Nunes',
+ comment is 'Default protocol for real functions of a single real variable.']).
+
+ :- public(eval/2).
+ :- mode(eval(+float, -float), one).
+ :- info(eval/2, [
+ comment is 'Calculate the function value.',
+ argnames is ['X', 'Fx']]).
+
+ :- public(evald/2).
+ :- mode(evald(+float, -float), one).
+ :- info(evald/2, [
+ comment is 'Calculate the value of the function derivative.',
+ argnames is ['X', 'DFx']]).
+
+:- end_protocol.
+
+
+:- object(f1,
+ implements(functionp)).
+
+ % x^2 - 4
+ % 2.0
+
+ eval(X, Y) :-
+ Y is X * X - 4.
+ evald(X, Y) :-
+ Y is 2 * X.
+
+:- end_object.
+
+
+:- object(f2,
+ implements(functionp)).
+
+ % x^7 + 9x^5 - 13x - 17
+ % 1.29999999999945448
+
+ eval(X, Y) :-
+ Y is X**7 + 9*X**5 - 13*X - 17.
+
+ evald(X, Y) :-
+ Y is 7*X**6 + 45*X**4 - 13.
+
+:- end_object.
+
+
+:- object(f3,
+ implements(functionp)).
+
+ % (x - sqrt(2))^7
+ % 1.41421356237309537
+
+ eval(X, Y) :-
+ Y is (X - sqrt(2.0))**8.
+
+ evald(X, Y) :-
+ Y is 8*(X - sqrt(2.0))**7.
+
+:- end_object.
+
+
+:- object(function_root,
+ implements(find_rootp)).
+
+ :- info([
+ version is 1.0,
+ date is 2006/4/21,
+ author is 'Paulo Nunes',
+ comment is 'Multi-threading interface to root finding algorithms.']).
+
+ :- threaded.
+
+ find_root(Function, A, B, Error, Zero) :-
+ find_root(Function, A, B, Error, Zero, _).
+
+ find_root(Function, A, B, Error, Zero, Algorithm) :-
+ threaded_call(
+ ( try_method(bisection, Function, A, B, Error, Zero)
+ ; try_method(newton, Function, A, B, Error, Zero)
+ ; try_method(muller, Function, A, B, Error, Zero)
+ )),
+ threaded_exit(try_method(Algorithm, Function, A, B, Error, Zero)).
+
+ try_method(Algorithm, Function, A, B, Error, Zero) :-
+ Algorithm::find_root(Function, A, B, Error, Zero).
+
+:- end_object.
+
+
+:- object(bisection,
+ implements(find_rootp)).
+
+ :- info([
+ version is 1.0,
+ date is 2006/4/21,
+ author is 'Paulo Nunes',
+ comment is 'Bisection algorithm.']).
+
+ find_root(Function, A, B, Error, Zero) :-
+ Function::eval(A, Fa),
+ Function::eval(B, Fb),
+ ( Fa > 0.0, Fb < 0.0 ->
+ true
+ ; Fa < 0.0, Fb > 0.0
+ ),
+ X0 is (A + B) / 2,
+ Function::eval(X0, F0),
+ bisection(Function, A, B, X0, F0, Error, Zero).
+
+ bisection(_, _, _, Xn1, 0.0, _, Xn1) :-
+ !.
+
+ bisection(_, Xn1, Xn, _, _, Error, Xn1) :-
+ abs(Xn1 - Xn) < Error,
+ !.
+
+ bisection(Function, An, Bn, _, _, Error, Zero) :-
+ Xn1 is (An + Bn) / 2,
+ Function::eval(Xn1, Fn1),
+ Function::eval(An, FAn),
+ ( Fn1*FAn < 0.0 ->
+ An1 is An,
+ Bn1 is Xn1
+ ; An1 is Xn1,
+ Bn1 is Bn
+ ),
+ bisection(Function, An1, Bn1, Xn1, Fn1, Error, Zero).
+
+:- end_object.
+
+
+:- object(newton,
+ implements(find_rootp)).
+
+ :- info([
+ version is 1.0,
+ date is 2006/4/21,
+ author is 'Paulo Nunes',
+ comment is 'Newton algorithm.']).
+
+ find_root(Function, Xa, Xb, Deviation, Zero) :-
+ X0 is (Xa + Xb) / 2,
+ newton(Function, X0, Deviation, Zero).
+
+ newton(Function, X0, Deviation, Zero) :-
+ Xn1 is X0,
+ Function::eval(Xn1, Fn1),
+ Function::evald(Xn1, DFn1),
+ Ac is -(Fn1 / DFn1),
+ newton(Function, Xn1, Deviation, Fn1, Ac, Zero).
+
+ % test deviation
+ newton(_, Xn1, Deviation, _, Ac, Xn1) :-
+ abs(Ac) < Deviation,
+ !.
+
+ % test solution
+ newton(_, Xn1, _, 0.0, _, Xn1) :-
+ !.
+
+ % calc
+ newton(Function, Xn, Deviation, _, Ac, Zero) :-
+ Xn1 is Xn + Ac,
+ Function::eval(Xn1, Fn1),
+ Function::evald(Xn1, DFn1),
+ Ac1 is (-(Fn1 / DFn1)),
+ newton(Function, Xn1, Deviation, Fn1, Ac1, Zero).
+
+:- end_object.
+
+
+:- object(muller,
+ implements(find_rootp)).
+
+ :- info([
+ version is 1.0,
+ date is 2006/4/21,
+ author is 'Paulo Nunes',
+ comment is 'Muller algorithm.']).
+
+ find_root(Function, Xa, Xb, Deviation, Zero) :-
+ Xc is (Xa + Xb) / 2,
+ muller(Function, Xa, Xc, Xb, Deviation, Zero).
+
+ muller(Function, Xa, Xb, Xc, Deviation, Zero) :-
+ Function::eval(Xa, Ya),
+ Function::eval(Xb, Yb),
+ Function::eval(Xc, Yc),
+ H1 is (Xb - Xa),
+ DDba is ((Yb - Ya) / H1),
+ Ac is (Deviation + 1),
+ muller(Function, Xa, Xb, Xc, Deviation, Ya, Yb, Yc, Ac, H1, DDba, Zero).
+
+ % complex
+ muller(_, _, _, complex, _, _, _, _, _, _, _, complex) :-
+ !.
+
+ % test deviation
+ muller(_, _, _, Xc, Deviation, _, _, _, Ac, _, _, Xc) :-
+ abs(Ac) < Deviation,
+ !.
+
+ % test solution
+ muller(_, _, _, Xc, _, _, _, 0.0, _, _, _, Xc) :-
+ !.
+
+ % calc
+ muller(Function, Xa, Xb, Xc, Deviation, _, Yb, Yc, _, _, DDba, Zero) :-
+ H2n is (Xc - Xb),
+ DDcbn is ((Yc - Yb) / H2n),
+ Cn is ((DDcbn - DDba) / (Xc - Xa)),
+ Bn is (DDcbn + H2n * Cn),
+ Rn is (Bn * Bn - 4.0 * Yc * Cn),
+ % complex
+ % write(Rn),
+ ( Rn < 0.0 ->
+ muller(Function, _, _, complex, Deviation, _, _, _, _, _, _, Zero),
+ !, fail
+ ; V is sqrt(Rn)
+ ),
+ ( Bn > 0.0 ->
+ Dn is (Bn + V)
+ ; Dn is (Bn - V)
+ ),
+ Acn is (-(2 * Yc / Dn)),
+ Xan is Xb,
+ Xbn is Xc,
+ Xcn is Xc + Acn,
+
+ Yan is Yb,
+ Ybn is Yc,
+ Function::eval(Xcn, Ycn),
+
+ H1n is H2n,
+ DDban is DDcbn,
+ muller(Function, Xan, Xbn, Xcn, Deviation, Yan, Ybn, Ycn, Acn, H1n, DDban, Zero).
+
+:- end_object.
diff --git a/Logtalk/examples/threads/functions/loader.lgt b/Logtalk/examples/threads/functions/loader.lgt
new file mode 100644
index 000000000..fab5c33fd
--- /dev/null
+++ b/Logtalk/examples/threads/functions/loader.lgt
@@ -0,0 +1,13 @@
+
+:- initialization(
+ logtalk_load(
+ functions)).
+
+/*
+If you intend to use the FOP XSL:FO processor for generating PDF documenting
+files, comment the directive above and uncomment the directive below
+
+:- initialization(
+ logtalk_load(
+ functions, [xmlsref(standalone)])).
+*/
diff --git a/Logtalk/examples/threads/nondet/NOTES.txt b/Logtalk/examples/threads/nondet/NOTES.txt
new file mode 100644
index 000000000..f6354a835
--- /dev/null
+++ b/Logtalk/examples/threads/nondet/NOTES.txt
@@ -0,0 +1,15 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+To load this example and for sample queries, please see the SCRIPT file.
+
+This folder contains a simple multi-threading example with calculating
+prime numbers on a given interval. Try to run the example in single and
+multi-processor (or multi-core) computers and compare the results. Most
+Prolog compilers allows you to measure the time taken for proving a goal
+using proprietary predicates.
diff --git a/Logtalk/examples/threads/nondet/SCRIPT.txt b/Logtalk/examples/threads/nondet/SCRIPT.txt
new file mode 100644
index 000000000..6fb5c8c0d
--- /dev/null
+++ b/Logtalk/examples/threads/nondet/SCRIPT.txt
@@ -0,0 +1,29 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+% start by loading the loading the example:
+
+| ?- logtalk_load(nondet(loader)).
+...
+
+
+% make a threaded call with a non-deterministic goal:
+
+| ?- threaded_call(lists::member(X, [1,2,3])).
+
+X = _G189
+yes
+
+% retrieve through backtracking all solutions for the non-deterministic goal:
+
+| ?- threaded_exit(lists::member(X, [1,2,3])).
+
+X = 1 ;
+X = 2 ;
+X = 3 ;
+no
diff --git a/Logtalk/examples/threads/nondet/loader.lgt b/Logtalk/examples/threads/nondet/loader.lgt
new file mode 100644
index 000000000..40a058999
--- /dev/null
+++ b/Logtalk/examples/threads/nondet/loader.lgt
@@ -0,0 +1,13 @@
+
+:- initialization(
+ logtalk_load(
+ nondet)).
+
+/*
+If you intend to use the FOP XSL:FO processor for generating PDF documenting
+files, comment the directive above and uncomment the directive below
+
+:- initialization(
+ logtalk_load(
+ nondet, [xmlsref(standalone)])).
+*/
diff --git a/Logtalk/examples/threads/nondet/nondet.lgt b/Logtalk/examples/threads/nondet/nondet.lgt
new file mode 100644
index 000000000..aeca9b6f3
--- /dev/null
+++ b/Logtalk/examples/threads/nondet/nondet.lgt
@@ -0,0 +1,12 @@
+
+:- object(lists).
+
+ :- threaded.
+
+ :- public(member/2).
+
+ member(H, [H| _]).
+ member(H, [_| T]) :-
+ member(H, T).
+
+:- end_object.
diff --git a/Logtalk/examples/threads/primes/NOTES.txt b/Logtalk/examples/threads/primes/NOTES.txt
new file mode 100644
index 000000000..f6354a835
--- /dev/null
+++ b/Logtalk/examples/threads/primes/NOTES.txt
@@ -0,0 +1,15 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+To load this example and for sample queries, please see the SCRIPT file.
+
+This folder contains a simple multi-threading example with calculating
+prime numbers on a given interval. Try to run the example in single and
+multi-processor (or multi-core) computers and compare the results. Most
+Prolog compilers allows you to measure the time taken for proving a goal
+using proprietary predicates.
diff --git a/Logtalk/examples/threads/primes/SCRIPT.txt b/Logtalk/examples/threads/primes/SCRIPT.txt
new file mode 100644
index 000000000..216db974b
--- /dev/null
+++ b/Logtalk/examples/threads/primes/SCRIPT.txt
@@ -0,0 +1,31 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+% start by loading the loading the example:
+
+| ?- logtalk_load(primes(loader)).
+...
+
+
+% calculate the prime numbers in a given interval using a single thread:
+
+| ?- primes::st_prime_numbers(1, 200000, Primes).
+
+Primes = [199999, 199967, 199961, 199933, 199931, 199921, 199909, 199889, 199877|...]
+
+Yes
+
+
+% calculate the prime numbers in a given interval by splitting the interval
+% in two sub-intervals and using a thread pere interval:
+
+| ?- primes::mt_prime_numbers(1, 200000, Primes).
+
+Primes = [199999, 199967, 199961, 199933, 199931, 199921, 199909, 199889, 199877|...]
+
+Yes
diff --git a/Logtalk/examples/threads/primes/loader.lgt b/Logtalk/examples/threads/primes/loader.lgt
new file mode 100644
index 000000000..5daa8989c
--- /dev/null
+++ b/Logtalk/examples/threads/primes/loader.lgt
@@ -0,0 +1,13 @@
+
+:- initialization(
+ logtalk_load(
+ primes)).
+
+/*
+If you intend to use the FOP XSL:FO processor for generating PDF documenting
+files, comment the directive above and uncomment the directive below
+
+:- initialization(
+ logtalk_load(
+ primes, [xmlsref(standalone)])).
+*/
diff --git a/Logtalk/examples/threads/primes/primes.lgt b/Logtalk/examples/threads/primes/primes.lgt
new file mode 100644
index 000000000..049ff0525
--- /dev/null
+++ b/Logtalk/examples/threads/primes/primes.lgt
@@ -0,0 +1,62 @@
+
+:- object(primes).
+
+ :- info([
+ version is 1.0,
+ author is 'Paulo Moura',
+ date is 2006/04/14,
+ comment is 'Simple example for comparing single and multi-threading calculation of prime numbers.']).
+
+ :- threaded.
+
+ :- public(st_prime_numbers/3).
+ :- mode(st_prime_numbers(+integer, +integer, -list), one).
+ :- info(st_prime_numbers/3, [
+ comment is 'Returns all prime numbers in the given interval using a single calculation thread.',
+ argnames is ['Inf', 'Sup', 'Primes']]).
+
+ :- public(mt_prime_numbers/3).
+ :- mode(mt_prime_numbers(+integer, +integer, -list), one).
+ :- info(mt_prime_numbers/3, [
+ comment is 'Returns all prime numbers in the given interval using two calculation threads.',
+ argnames is ['Inf', 'Sup', 'Primes']]).
+
+ st_prime_numbers(N, M, Primes) :-
+ M > N,
+ prime_numbers(N, M, [], Primes).
+
+ mt_prime_numbers(N, M, Primes) :-
+ M > N,
+ N1 is N + (M - N) // 2,
+ N2 is N1 + 1,
+ threaded_call(prime_numbers(N, N1, [], Acc)),
+ threaded_call(prime_numbers(N2, M, Acc, Primes)),
+ threaded_exit(prime_numbers(N, N1, [], Acc)),
+ threaded_exit(prime_numbers(N2, M, Acc, Primes)).
+
+ prime_numbers(N, M, Primes, Primes) :-
+ N > M,
+ !.
+ prime_numbers(N, M, Acc, Primes) :-
+ ( is_prime(N) ->
+ Acc2 = [N| Acc]
+ ; Acc2 = Acc),
+ N2 is N + 1,
+ prime_numbers(N2, M, Acc2, Primes).
+
+ is_prime(2) :- !.
+ is_prime(Prime):-
+ Prime > 2,
+ Prime mod 2 =:= 1,
+ Sqrt is sqrt(Prime),
+ is_prime(3, Sqrt, Prime).
+
+ is_prime(N, Sqrt, Prime):-
+ ( N > Sqrt ->
+ true
+ ; Prime mod N > 0,
+ N2 is N + 2,
+ is_prime(N2, Sqrt, Prime)
+ ).
+
+:- end_object.
diff --git a/Logtalk/wenv/context/Logtalk.chl b/Logtalk/wenv/context/Logtalk.chl
new file mode 100644
index 000000000..969e204f1
--- /dev/null
+++ b/Logtalk/wenv/context/Logtalk.chl
@@ -0,0 +1,57 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// Logtalk highlighter
+// Paulo Moura
+//
+// http://logtalk.org/
+//
+// Last updated on: October, 16 2006
+//
+//////////////////////////////////////////////////////////////////////////////
+
+
+
+Language: Logtalk
+
+Filter: Logtalk files (*.lgt)|*.lgt
+
+HelpFile:
+
+CaseSensitive: 1
+
+LineComment: %
+
+BlockCommentBeg: /*
+BlockCommentEnd: */
+
+IdentifierBegChars:
+IdentifierChars:
+
+NumConstBegChars:
+NumConstChars:
+
+EscapeChar: \
+
+
+KeyWords1: :: ^^ { }
+
+
+StringBegChar: "
+StringEndChar: "
+MultilineStrings: 0
+
+UsePreprocessor: 0
+
+CurrLineHighlighted: 0
+
+
+SpaceCol: clWindowText clWindow
+Keyword1Col: clNavy clWindow B
+IdentifierCol: clBlue clWindow
+CommentCol: clGray clWindow I
+NumberCol: clWindowText clWindow
+StringCol: clMaroon clWindow
+SymbolCol: clPurple clWindow
+PreprocessorCol: clBlue clWindow
+SelectionCol: clWhite clNavy
+CurrentLineCol: clBlack clYellow
diff --git a/Logtalk/wenv/context/NOTES.txt b/Logtalk/wenv/context/NOTES.txt
new file mode 100644
index 000000000..f17207dd0
--- /dev/null
+++ b/Logtalk/wenv/context/NOTES.txt
@@ -0,0 +1,20 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+This directory contains files that provides basic syntax coloring for
+editing Logtalk source files with the text editor Context 0.98.3 or
+later version:
+
+ http://www.context.cx/
+
+To install copy the file "Logtalk.chl" to the Highlighters folder of
+your ConTEXT folder (e.g. C:\Program Files\ConTEXT\Highlighters). If
+ConTEXT is running, restart it to update its list of highlighters.
+
+
+THESE SYNTAX COLORING SUPPORT FILES ARE UNDER DEVELOPMENT.
diff --git a/Logtalk/wenv/npp/NOTES.txt b/Logtalk/wenv/npp/NOTES.txt
new file mode 100644
index 000000000..c97be2319
--- /dev/null
+++ b/Logtalk/wenv/npp/NOTES.txt
@@ -0,0 +1,24 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+This directory contains files that provides basic syntax coloring and
+code completion for editing Logtalk source files with the text editor
+Notepad++ 3.9 or later version:
+
+ http://notepad-plus.sourceforge.net/
+
+Install the supporting files by performing the following steps:
+
+1. Copy the file "userDefineLang.xml" to the folder "%APPDATA%\Notepad++".
+ If the file already exists, merge the contents of the two files.
+
+2. In order to use auto-completion, copy the file "logtalk.api" to the
+ directory YOUR_NPP_INSTALL_DIR\plugins\APIs.
+
+
+THESE SYNTAX COLORING SUPPORT FILES ARE UNDER DEVELOPMENT.
diff --git a/Logtalk/wenv/npp/logtalk.api b/Logtalk/wenv/npp/logtalk.api
new file mode 100644
index 000000000..af6a6a63e
--- /dev/null
+++ b/Logtalk/wenv/npp/logtalk.api
@@ -0,0 +1,138 @@
+abolish
+abolish_category
+abolish_events
+abolish_object
+abolish_protocol
+after
+alias
+arg
+asserta
+assertz
+atom
+atomic
+atom_chars
+atom_chars
+atom_codes
+atom_codes
+atom_concat
+atom_concat
+atom_length
+at_end_of_stream
+bagof
+before
+call
+calls
+catch
+category
+category_property
+char_code
+char_conversion
+clause
+close
+compound
+copy_term
+create_category
+create_object
+create_protocol
+current_category
+current_char_conversion
+current_event
+current_input
+current_logtalk_flag
+current_object
+current_op
+current_output
+current_predicate
+current_prolog_flag
+current_protocol
+define_events
+discontiguous
+dynamic
+encoding
+end_category
+end_object
+end_protocol
+expand_term
+extends
+extends_object
+extends_protocol
+fail
+findall
+float
+flush_output
+forall
+functor
+get_byte
+get_char
+get_code
+halt
+implements
+implements_protocol
+imports
+imports_category
+info
+initialization
+instantiates
+instantiates_class
+integer
+logtalk_compile
+logtalk_library_path
+logtalk_load
+meta_predicate
+mode
+nl
+nonvar
+number
+number_chars
+number_chars
+number_codes
+number_codes
+object
+object_property
+once
+op
+open
+parameter
+peek_byte
+peek_char
+peek_code
+phrase
+predicate_property
+private
+protected
+protocol
+protocol_property
+public
+put_byte
+put_char
+put_code
+read
+read_term
+repeat
+retract
+retractall
+self
+sender
+setof
+set_input
+set_logtalk_flag
+set_output
+set_prolog_flag
+set_stream_position
+specializes
+specializes_class
+stream_property
+sub_atom
+term_expansion
+this
+threaded
+threaded_call
+threaded_exit
+throw
+true
+unify_with_occurs_check
+uses
+var
+write
+writeq
+write_canonical
diff --git a/Logtalk/wenv/npp/userDefineLang.xml b/Logtalk/wenv/npp/userDefineLang.xml
new file mode 100644
index 000000000..d368aeef1
--- /dev/null
+++ b/Logtalk/wenv/npp/userDefineLang.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+ "'0"'0
+ :-
+ :-
+ ^
+ 1/* 2*/ 0%
+ :-
+ ::
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Logtalk/wenv/smultron/NOTES.txt b/Logtalk/wenv/smultron/NOTES.txt
new file mode 100644
index 000000000..fc879a80a
--- /dev/null
+++ b/Logtalk/wenv/smultron/NOTES.txt
@@ -0,0 +1,29 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+This directory contains the Logtalk.plist file that provides basic syntax
+coloring, code completion, and entity index (using the "function" list)
+for editing Logtalk source files with the Smultron 2.2 text editor:
+
+ http://smultron.sourceforge.net/
+
+To install:
+
+1. Copy the file "logtalk.plist" to the application bundle (ctrl-click on
+Smultron and choose Show Package Contents and then navigate to the folder
+Contents/Resources/Syntax Definitions/).
+
+2. Copy the file "SyntaxDefinitions.plist" to the folder:
+
+ ~/Library/Application Support/Smultron
+
+If the file already exists, merge the contents of the two files.
+
+Logtalk source files (including the programming examples) are usually
+formatted using four-spaces tabs; you may set the tab width on the
+editor preference panel.
diff --git a/Logtalk/wenv/smultron/SyntaxDefinitions.plist b/Logtalk/wenv/smultron/SyntaxDefinitions.plist
new file mode 100644
index 000000000..618b5b51b
--- /dev/null
+++ b/Logtalk/wenv/smultron/SyntaxDefinitions.plist
@@ -0,0 +1,14 @@
+
+
+
+
+
+ name
+ Logtalk
+ file
+ logtalk
+ extensions
+ lgt config
+
+
+
diff --git a/Logtalk/wenv/smultron/logtalk.plist b/Logtalk/wenv/smultron/logtalk.plist
new file mode 100644
index 000000000..82a6327f5
--- /dev/null
+++ b/Logtalk/wenv/smultron/logtalk.plist
@@ -0,0 +1,183 @@
+
+
+
+
+ autocompleteWords
+
+ encoding
+ calls
+ category
+ dynamic
+ end_category
+ end_object
+ end_protocol
+ info
+ initialization
+ object
+ protocol
+ threaded
+ uses
+ alias
+ discontiguous
+ meta_predicate
+ mode
+ op
+ private
+ protected
+ public
+ current_object
+ current_protocol
+ current_category
+ object_property
+ protocol_property
+ category_property
+ create_object
+ create_protocol
+ create_category
+ abolish_object
+ abolish_protocol
+ abolish_category
+ extends_object
+ extends_protocol
+ implements_protocol
+ imports_category
+ instantiates_class
+ specializes_class
+ abolish_events
+ current_event
+ define_events
+ logtalk_load
+ logtalk_compile
+ logtalk_library_path
+ current_logtalk_flag
+ set_logtalk_flag
+ threaded_call
+ threaded_exit
+ self
+ this
+ sender
+ parameter
+ before
+ after
+ phrase
+ expand_term
+ term_expansion
+ true
+ fail
+ call
+ catch
+ throw
+ unify_with_occurs_check
+ var
+ atom
+ integer
+ float
+ atomic
+ compound
+ nonvar
+ number
+ arg
+ copy_term
+ functor
+ current_predicate
+ predicate_property
+ abolish
+ assertz
+ asserta
+ clause
+ retract
+ retractall
+ bagof
+ findall
+ forall
+ setof
+ current_input
+ current_output
+ set_input
+ set_output
+ open
+ close
+ flush_output
+ stream_property
+ at_end_of_stream
+ set_stream_position
+ get_char
+ get_code
+ peek_char
+ peek_code
+ put_char
+ put_code
+ nl
+ get_byte
+ peek_byte
+ put_byte
+ read
+ read_term
+ write
+ writeq
+ write_canonical
+ atom_chars
+ atom_codes
+ atom_concat
+ number_chars
+ number_codes
+ current_op
+ char_conversion
+ current_char_conversion
+ once
+ repeat
+ atom_length
+ atom_concat
+ sub_atom
+ atom_chars
+ atom_codes
+ char_code
+ number_chars
+ number_codes
+ set_prolog_flag
+ current_prolog_flag
+ halt
+
+ beginCommand
+
+ beginFirstMultiLineComment
+ /*
+ beginInstruction
+
+ beginSecondMultiLineComment
+
+ beginVariable
+
+ endCommand
+
+ endFirstMultiLineComment
+ */
+ endInstruction
+
+ endSecondMultiLineComment
+
+ endVariable
+
+ firstSingleLineComment
+ %
+ firstString
+ "
+ functionDefinition
+ ((?<=:-\sobject\()|(?<=:-\sprotocol\()|(?<=:-\scategory\())[a-z][a-zA-Z_]*
+ removeFromFunction
+
+ keywords
+
+ ::
+ ^^
+
+ keywordsCaseSensitive
+
+ recolourKeywordIfAlreadyColoured
+
+ secondSingleLineComment
+
+ secondString
+ '
+
+
diff --git a/Logtalk/wenv/superedi/Logtalk.col b/Logtalk/wenv/superedi/Logtalk.col
new file mode 100644
index 000000000..9582620db
--- /dev/null
+++ b/Logtalk/wenv/superedi/Logtalk.col
@@ -0,0 +1,44 @@
+[NormalText]
+BkColor=FFFFFF
+TextColor=000000
+
+[SelectedText]
+[MatchingBracket]
+
+[Whitespace]
+BkColor=FFFFFF
+
+[SelectionMargin]
+[Preprocessor]
+
+[Comment]
+TextColor=008000
+
+[Keyword 1]
+BkColor=FFFFFF
+TextColor=000000
+
+[Keyword 2]
+BkColor=FFFFFF
+TextColor=000000
+
+[Keyword 3]
+BkColor=FFFFFF
+TextColor=000000
+
+[Keyword 4]
+BkColor=FFFFFF
+TextColor=000000
+
+[Keyword 5]
+BkColor=FFFFFF
+TextColor=000000
+
+[Keyword 6]
+BkColor=FFFFFF
+TextColor=000000
+
+[Number]
+[Operator]
+[Char]
+[String]
diff --git a/Logtalk/wenv/superedi/Logtalk.syn b/Logtalk/wenv/superedi/Logtalk.syn
new file mode 100644
index 000000000..6fabd3015
--- /dev/null
+++ b/Logtalk/wenv/superedi/Logtalk.syn
@@ -0,0 +1,322 @@
+; Superedi syntax definitions for Logtalk (http://logtalk.org/)
+;
+; Author: Paulo Moura
+; Last changed in: October 16, 2006
+
+
+C=1
+
+[Syntax]
+Namespace1 = 6
+IgnoreCase = NO
+InitKeyWordChars =
+KeyWordChars = a-zA-Z0-9_:^;*+,-./;<=>?@[\]^{|}
+KeyWordLength =
+BracketChars =
+OperatorChars = <=>?@[\]|
+PreprocStart =
+SyntaxStart =
+SyntaxEnd =
+HexPrefix = 0x
+CommentStart = /*
+CommentEnd = */
+CommentStartAlt =
+CommentEndAlt =
+SingleComment = %
+SingleCommentCol =
+SingleCommentAlt =
+SingleCommentColAlt =
+SingleCommentEsc =
+StringsSpanLines = Yes
+StringStart = "
+StringEnd = "
+StringAlt =
+StringEsc = \
+CharStart = '
+CharEnd = '
+CharEsc = \
+
+
+[FunctionList]
+Object = ^\s*:-\sobject[(]{[a-z][a-zA-Z_]+}
+Interface = ^\s*:-\sprotocol[(]{[a-z][a-zA-Z_]+}
+Item = ^\s*:-\scategory[(]{[a-z][a-zA-Z_]+}
+
+
+[Keywords 1]
+
+; Logtalk message sending operators
+
+^^
+:-
+.
+,
+;
+::
+
+
+; Logtalk external call
+{
+}
+
+
+[Keywords 2]
+
+; Logtalk opening entity directives
+object
+protocol
+category
+module
+
+
+; Logtalk closing entity directives
+end_object
+end_protocol
+end_category
+
+; Logtalk entity relations
+instantiates
+specializes
+extends
+imports
+implements
+
+
+[Keywords 3]
+
+; Logtalk directives
+alias
+encoding
+export
+initialization
+info
+mode
+dynamic
+discontiguous
+multifile
+public
+protected
+private
+meta_predicate
+op
+calls
+uses
+use_module
+threaded
+
+
+[Keywords 4]
+
+; Logtalk built-in predicates
+current_object
+current_protocol
+current_category
+create_object
+create_protocol
+create_category
+object_property
+protocol_property
+category_property
+abolish_object
+abolish_protocol
+abolish_category
+extends_object
+extends_protocol
+implements_protocol
+instantiates_class
+specializes_class
+imports_category
+abolish_events
+current_event
+define_events
+current_logtalk_flag
+set_logtalk_flag
+logtalk_compile
+logtalk_load
+logtalk_library_path
+forall
+retractall
+
+
+[Keywords 5]
+
+; Logtalk built-in methods
+parameter
+self
+sender
+this
+current_predicate
+predicate_property
+abolish
+asserta
+assertz
+clause
+retract
+retractall
+bagof
+findall
+forall
+setof
+before
+after
+expand_term
+term_expansion
+phrase
+threaded_call
+threaded_exit
+
+; Mode operators
+?
+@
+
+; Control constructs
+true
+fail
+call
+!
+,
+;
+-->
+->
+catch
+throw
+
+; Term unification
+=
+unify_with_occurs_check
+\=
+
+; Term testing
+var
+atom
+integer
+float
+atomic
+compound
+nonvar
+number
+
+; Term comparison
+@=<
+==
+\==
+@<
+@>
+@>=
+
+; Term creation and decomposition
+functor
+arg
+=..
+copy_term
+
+; Arithemtic evaluation
+is
+
+; Arithemtic comparison
+=:=
+=\=
+<
+=<
+>
+>=
+
+; Stream selection and control
+current_input
+current_output
+set_input
+set_output
+open
+close
+flush_output
+stream_property
+at_end_of_stream
+set_stream_position
+
+; Character input/output
+get_char
+get_code
+peek_char
+peek_code
+put_char
+put_code
+nl
+
+; Byte input/output
+get_byte
+peek_byte
+put_byte
+
+; Term input/output
+read_term
+read
+write_term
+write
+writeq
+write_canonical
+op
+current_op
+char_conversion
+current_char_conversion
+
+; Logic and control
+\+
+once
+repeat
+
+; Atomic term processing
+atom_length
+atom_concat
+sub_atom
+atom_chars
+atom_codes
+char_code
+number_chars
+number_codes
+
+; Implementation defined hooks functions
+set_prolog_flag
+current_prolog_flag
+halt
+
+; Evaluable functors
++
+-
+*
+//
+/
+rem
+mod
+abs
+sign
+float_integer_part
+float_fractional_part
+float
+floor
+truncate
+round
+ceiling
+
+; Other arithemtic functors
+**
+sin
+cos
+atan
+exp
+log
+sqrt
+
+; Bitwise functors
+>>
+<<
+/\
+\/
+\
+
+; Logtalk end-of-clause
+.
+
+; Logtalk list operator
+|
+
+
diff --git a/Logtalk/wenv/superedi/NOTES.txt b/Logtalk/wenv/superedi/NOTES.txt
new file mode 100644
index 000000000..7cb9014bd
--- /dev/null
+++ b/Logtalk/wenv/superedi/NOTES.txt
@@ -0,0 +1,28 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+This directory contains files that provides basic syntax coloring,
+entity index, and code completion for editing Logtalk source files
+with the text editor SuperEdi 3.8.1 or later version:
+
+ http://www.wolosoft.com/en/superedi/index.html
+
+Install the supporting files by performing the following steps:
+
+1. Copy the file "Logtalk.syn" to the "Syntax" directory in your
+ SuperEdi installation directory (replacing any existing older file).
+
+2. Copy the file "Logtalk.col" to the "Syntax" directory in your
+ SuperEdi installation directory (replacing any existing older file).
+
+3. Go to the Tools/Options dialog and create a new file type named
+ "Logtalk". Set the file extension to "lgt" and the syntax and color
+ scheme to "Logtalk". Set the tab size to "4".
+
+
+THESE SYNTAX COLORING SUPPORT FILES ARE UNDER DEVELOPMENT.
diff --git a/Logtalk/wenv/textwrangler/NOTES.txt b/Logtalk/wenv/textwrangler/NOTES.txt
new file mode 100644
index 000000000..bf447ada4
--- /dev/null
+++ b/Logtalk/wenv/textwrangler/NOTES.txt
@@ -0,0 +1,9 @@
+=================================================================
+Logtalk - Object oriented extension to Prolog
+Release 2.28.2
+
+Copyright (c) 1998-2006 Paulo Moura. All Rights Reserved.
+=================================================================
+
+
+See the ../bbedit folder.
diff --git a/Logtalk/wenv/vim/completion/logtalk.dict b/Logtalk/wenv/vim/completion/logtalk.dict
new file mode 100644
index 000000000..8ab5be73e
--- /dev/null
+++ b/Logtalk/wenv/vim/completion/logtalk.dict
@@ -0,0 +1,138 @@
+encoding
+calls
+category
+dynamic
+end_category
+end_object
+end_protocol
+info
+initialization
+object
+protocol
+threaded
+uses
+alias
+discontiguous
+meta_predicate
+mode
+op
+private
+protected
+public
+current_object
+current_protocol
+current_category
+object_property
+protocol_property
+category_property
+create_object
+create_protocol
+create_category
+abolish_object
+abolish_protocol
+abolish_category
+extends
+extends_object
+extends_protocol
+implements
+implements_protocol
+imports
+imports_category
+instantiates
+instantiates_class
+specializes
+specializes_class
+abolish_events
+current_event
+define_events
+logtalk_load
+logtalk_compile
+logtalk_library_path
+current_logtalk_flag
+set_logtalk_flag
+threaded_call
+threaded_exit
+self
+this
+sender
+parameter
+before
+after
+phrase
+expand_term
+term_expansion
+true
+fail
+call
+catch
+throw
+unify_with_occurs_check
+var
+atom
+integer
+float
+atomic
+compound
+nonvar
+number
+arg
+copy_term
+functor
+current_predicate
+predicate_property
+abolish
+assertz
+asserta
+clause
+retract
+retractall
+bagof
+findall
+forall
+setof
+current_input
+current_output
+set_input
+set_output
+open
+close
+flush_output
+stream_property
+at_end_of_stream
+set_stream_position
+get_char
+get_code
+peek_char
+peek_code
+put_char
+put_code
+nl
+get_byte
+peek_byte
+put_byte
+read
+read_term
+write
+writeq
+write_canonical
+atom_chars
+atom_codes
+atom_concat
+number_chars
+number_codes
+current_op
+char_conversion
+current_char_conversion
+once
+repeat
+atom_length
+atom_concat
+sub_atom
+atom_chars
+atom_codes
+char_code
+number_chars
+number_codes
+set_prolog_flag
+current_prolog_flag
+halt
diff --git a/Logtalk/wenv/vim/indent/logtalk.vim b/Logtalk/wenv/vim/indent/logtalk.vim
new file mode 100644
index 000000000..52ec31828
--- /dev/null
+++ b/Logtalk/wenv/vim/indent/logtalk.vim
@@ -0,0 +1,61 @@
+" Maintainer: Paulo Moura
+" Revised on: 2006.10.22
+" Language: Logtalk
+
+" This Logtalk indent file is a modified version of the Prolog
+" indent file written by Gergely Kontra
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+let b:did_indent = 1
+
+setlocal indentexpr=GetLogtalkIndent()
+setlocal indentkeys-=:,0#
+setlocal indentkeys+=0%,-,0;,>,0)
+
+" Only define the function once.
+"if exists("*GetLogtalkIndent")
+" finish
+"endif
+
+function! GetLogtalkIndent()
+ " Find a non-blank line above the current line.
+ let pnum = prevnonblank(v:lnum - 1)
+ " Hit the start of the file, use zero indent.
+ if pnum == 0
+ return 0
+ endif
+ let line = getline(v:lnum)
+ let pline = getline(pnum)
+
+ let ind = indent(pnum)
+ " Previous line was comment -> use previous line's indent
+ if pline =~ '^\s*%'
+ retu ind
+ endif
+ " Check for entity opening directive on previous line
+ if pline =~ '^\s*:-\s\(object\|protocol\|category\)\ze(.*,$'
+ let ind = ind + &sw
+ " Check for clause head on previous line
+ elseif pline =~ ':-\s*\(%.*\)\?$'
+ let ind = ind + &sw
+ " Check for entity closing directive on previous line
+ elseif pline =~ '^\s*:-\send_\(object\|protocol\|category\)\.\(%.*\)\?$'
+ let ind = ind - &sw
+ " Check for end of clause on previous line
+ elseif pline =~ '\.\s*\(%.*\)\?$'
+ let ind = ind - &sw
+ endif
+ " Check for opening conditional on previous line
+ if pline =~ '^\s*\([(;]\|->\)'
+ let ind = ind + &sw
+ endif
+ " Check for closing an unclosed paren, or middle ; or ->
+ if line =~ '^\s*\([);]\|->\)'
+ let ind = ind - &sw
+ endif
+ return ind
+endfunction
diff --git a/Logtalk/wenv/vim/syntax/logtalk.vim b/Logtalk/wenv/vim/syntax/logtalk.vim
new file mode 100644
index 000000000..09eeec1d3
--- /dev/null
+++ b/Logtalk/wenv/vim/syntax/logtalk.vim
@@ -0,0 +1,397 @@
+" Vim syntax file
+"
+" Language: Logtalk
+" Maintainer: Paulo Moura
+" Last Change: September 17, 2006
+
+
+" Quit when a syntax file was already loaded:
+
+if version < 600
+ syntax clear
+elseif exists("b:current_syntax")
+ finish
+endif
+
+
+" Logtalk is case sensitive:
+
+syn case match
+
+
+" Logtalk variables
+
+syn match logtalkVariable "\<\(\u\|_\)\(\w\)*\>"
+
+
+" Logtalk clause functor
+
+syn match logtalkOperator ":-"
+
+
+" Logtalk quoted atoms and strings
+
+syn region logtalkString start=+"+ skip=+\\"+ end=+"+
+syn region logtalkAtom start=+'+ skip=+\\'+ end=+'+
+
+
+" Logtalk message sending operators
+
+syn match logtalkOperator "::"
+syn match logtalkOperator "\^\^"
+
+
+" Logtalk external call
+
+syn region logtalkExtCall matchgroup=logtalkExtCallTag start="{" matchgroup=logtalkExtCallTag end="}" contains=ALL
+
+
+" Logtalk opening entity directives
+
+syn region logtalkOpenEntityDir matchgroup=logtalkOpenEntityDirTag start=":- object(" matchgroup=logtalkOpenEntityDirTag end=")\." contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator,logtalkEntityRel
+syn region logtalkOpenEntityDir matchgroup=logtalkOpenEntityDirTag start=":- protocol(" matchgroup=logtalkOpenEntityDirTag end=")\." contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator,logtalkEntityRel
+syn region logtalkOpenEntityDir matchgroup=logtalkOpenEntityDirTag start=":- category(" matchgroup=logtalkOpenEntityDirTag end=")\." contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator,logtalkEntityRel
+
+
+" Logtalk closing entity directives
+
+syn match logtalkCloseEntityDir ":- end_object\."
+syn match logtalkCloseEntityDir ":- end_protocol\."
+syn match logtalkCloseEntityDir ":- end_category\."
+
+
+" Logtalk entity relations
+
+syn region logtalkEntityRel matchgroup=logtalkEntityRelTag start="instantiates(" matchgroup=logtalkEntityRelTag end=")" contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator contained
+syn region logtalkEntityRel matchgroup=logtalkEntityRelTag start="specializes(" matchgroup=logtalkEntityRelTag end=")" contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator contained
+syn region logtalkEntityRel matchgroup=logtalkEntityRelTag start="extends(" matchgroup=logtalkEntityRelTag end=")" contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator contained
+syn region logtalkEntityRel matchgroup=logtalkEntityRelTag start="imports(" matchgroup=logtalkEntityRelTag end=")" contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator contained
+syn region logtalkEntityRel matchgroup=logtalkEntityRelTag start="implements(" matchgroup=logtalkEntityRelTag end=")" contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator contained
+
+
+" Logtalk directives
+
+syn region logtalkDir matchgroup=logtalkDirTag start=":- alias(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- atomic(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- encoding(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- initialization(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- info(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- mode(" matchgroup=logtalkDirTag end=")\." contains=logtalkOperator, logtalkAtom
+syn region logtalkDir matchgroup=logtalkDirTag start=":- dynamic(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn match logtalkDirTag ":- dynamic\."
+syn region logtalkDir matchgroup=logtalkDirTag start=":- discontiguous(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- multifile(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- public(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- protected(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- private(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- meta_predicate(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- op(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- calls(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- uses(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn match logtalkDirTag ":- threaded\."
+
+
+" Module directives
+
+syn region logtalkDir matchgroup=logtalkDirTag start=":- module(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- export(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- use_module(" matchgroup=logtalkDirTag end=")\." contains=ALL
+
+
+" Logtalk built-in predicates
+
+syn match logtalkBuiltIn "\<\(abolish\|c\(reate\|urrent\)\)_\(object\|protocol\|category\)\ze("
+
+syn match logtalkBuiltIn "\<\(object\|protocol\|category\)_property\ze("
+
+syn match logtalkBuiltIn "\"
+syn match logtalkKeyword "\"
+syn match logtalkKeyword "\"
+syn match logtalkOperator "->"
+syn match logtalkKeyword "\"
+syn match logtalkOperator "@>="
+
+
+" Term creation and decomposition
+
+syn match logtalkKeyword "\"
+
+
+" Arithemtic comparison
+
+syn match logtalkOperator "=:="
+syn match logtalkOperator "=\\="
+syn match logtalkOperator "<"
+syn match logtalkOperator "=<"
+syn match logtalkOperator ">"
+syn match logtalkOperator ">="
+
+
+" Stream selection and control
+
+syn match logtalkKeyword "\<\(current\|set\)_\(in\|out\)put\ze("
+syn match logtalkKeyword "\"
+syn match logtalkKeyword "\"
+syn match logtalkKeyword "\"
+
+
+" Term input/output
+
+syn match logtalkKeyword "\"
+
+
+" Atomic term processing
+
+syn match logtalkKeyword "\"
+
+
+" Evaluable functors
+
+syn match logtalkOperator "+"
+syn match logtalkOperator "-"
+syn match logtalkOperator "\*"
+syn match logtalkOperator "//"
+syn match logtalkOperator "/"
+syn match logtalkKeyword "\"
+syn match logtalkKeyword "\"
+syn match logtalkKeyword "\>"
+syn match logtalkOperator "<<"
+syn match logtalkOperator "/\\"
+syn match logtalkOperator "\\/"
+syn match logtalkOperator "\\"
+
+
+" Logtalk list operator
+
+syn match logtalkOperator "|"
+
+
+" Logtalk numbers
+
+syn match logtalkNumber "\<\d\+\>"
+syn match logtalkNumber "\<\d\+\.\d\+\>"
+syn match logtalkNumber "\<\d\+[eE][-+]\=\d\+\>"
+syn match logtalkNumber "\<\d\+\.\d\+[eE][-+]\=\d\+\>"
+syn match logtalkNumber "\<0'.\>"
+syn match logtalkNumber "\<0b[0-1]\+\>"
+syn match logtalkNumber "\<0o\o\+\>"
+syn match logtalkNumber "\<0x\x\+\>"
+
+
+" Logtalk end-of-clause
+
+syn match logtalkOperator "\."
+
+
+" Logtalk comments
+
+syn region logtalkBlockComment start="/\*" end="\*/" fold
+syn match logtalkLineComment "%.*"
+
+
+" Logtalk entity folding
+
+syn region logtalkEntity transparent fold keepend start=":- object(" end=":- end_object\." contains=ALL
+syn region logtalkEntity transparent fold keepend start=":- protocol(" end=":- end_protocol\." contains=ALL
+syn region logtalkEntity transparent fold keepend start=":- category(" end=":- end_category\." contains=ALL
+
+
+syn sync ccomment logtalkBlockComment maxlines=50
+
+
+" Define the default highlighting.
+" For version 5.7 and earlier: only when not done already
+" For version 5.8 and later: only when an item doesn't have highlighting yet
+
+if version >= 508 || !exists("did_logtalk_syn_inits")
+ if version < 508
+ let did_logtalk_syn_inits = 1
+ command -nargs=+ HiLink hi link
+ else
+ command -nargs=+ HiLink hi def link
+ endif
+
+ HiLink logtalkBlockComment Comment
+ HiLink logtalkLineComment Comment
+
+ HiLink logtalkOpenEntityDir Normal
+ HiLink logtalkOpenEntityDirTag PreProc
+
+ HiLink logtalkEntity Normal
+
+ HiLink logtalkEntityRel Normal
+ HiLink logtalkEntityRelTag PreProc
+
+ HiLink logtalkCloseEntityDir PreProc
+
+ HiLink logtalkDir Normal
+ HiLink logtalkDirTag PreProc
+
+ HiLink logtalkAtom String
+ HiLink logtalkString String
+
+ HiLink logtalkNumber Number
+
+ HiLink logtalkKeyword Keyword
+
+ HiLink logtalkBuiltIn Keyword
+ HiLink logtalkBuiltInMethod Keyword
+
+ HiLink logtalkOperator Operator
+
+ HiLink logtalkExtCall Normal
+ HiLink logtalkExtCallTag Operator
+
+ HiLink logtalkVariable Identifier
+
+ delcommand HiLink
+
+endif
+
+
+let b:current_syntax = "logtalk"
+
+setlocal ts=4
+setlocal sw=4
+setlocal fdm=syntax
+setlocal fdc=2
+setlocal autoindent