    /*
       Highlighting test case for Logtalk

       Copied from the Logtalk distribution by the Logtalk copright holder
       and contributed using the Apache License 2.0
    */

    :- encoding(Encoding).	% this is a single-line comment

    /*
    this is
    a block
    comment
    */

    :- if(Goal).
    	% conditional
    :- elif(Goal).
    	% compilation
    :- else.
    	% directives
    :- endif.

    :- initialization(Goal).
    :- op(Precedence, Associativity, Operator).
    :- ensure_loaded(File).
    :- include(File).
    :- set_prolog_flag(Flag, Value).
    :- set_logtalk_flag(Flag, Value).

    :- object(prototype,
    	implements(protocol),
    	imports(category),
    	extends(parent)).

    	:- info([
    		version is 1:47:0,
    		author is 'Paulo Moura',
    		date is 2019-09-18,
    		comment is 'Sample prototype for testing syntax coloring.'
    	]).

    	:- built_in.
    	:- threaded.
    	:- dynamic.

    	:- initialization(some_goal(X, Y)).

    	:- uses([
    		foobar as fb
    	]).

    	:- alias(set, [member/2 as set_member/2]).
    	:- alias(words, [singular//0 as peculiar//0]).

    	:- uses(list, [append/3, member/2]).
    	:- uses(queues, [new/1 as new_queue/1]).

    	:- use_module(module).
    	:- use_module(module, [append/3, member/2]).

    	:- multifile(zzz/1).
    	:- multifile(module:zzz/1).
    	:- multifile(object::zzz/1).

    	:- coinductive(comember/1).

    	:- use_module(module, [xxx/1, yyy/2, zzz/3]).
    	:- export(bbb/3).
    	:- reexport(cccc/4).

    	:- public(aaa/2).
    	:- meta_predicate(aaa(::, *)).
    	:- discontiguous(aaa/2).
    	:- mode(aaa(+callable, ?integer), zero_or_one).
    	:- info(position/2, [
    		comment is 'Predicate brief description.',
    		arguments is ['Arg1'-'Arg1 description', 'Arg2'-'Arg2 description']
    	]).

    	:- public(nt//2).
    	:- meta_non_terminal(nt(1, *)).

    	:- protected(bbb/2).
    	:- synchronized(bbb/2).
    	:- mode(bbb(+integer, -float), one).
    	:- info(bbb/2, [
    		comment is 'Predicate brief description.',
    		argnames is ['Arg1', 'Arg2']
    	]).

    	:- private(ccc/2).
    	:- dynamic(ccc/2).
    	:- mode(ccc(@atom, ?atom, ++list, --ground), one_or_more).
    	:- info(ccc/2, [
    		comment is 'Predicate brief description.',
    		argnames is ['Arg1', 'Arg2']
    	]).

    	enumerating_entities(Object, Protocol, Category) :-
    		current_category(Category),
    		current_object(Object),
    		current_protocol(Protocol).

    	enumerating_properties :-
    		category_property(Category, Property),
    		object_property(Object, Property),
    		protocol_property(Protocol, Property).

    	creating_entities(Object, Protocol, Category) :-
    		create_category(Category, Relations, Directives, Clauses),
    		create_object(Object, Relations, Directives, Clauses),
    		create_protocol(Protocol, Relations, Directives).

    	abolishing_entities(Object, Protocol, Category) :-
    		abolish_category(Category),
    		abolish_object(Object),
    		abolish_protocol(Protocol).

    	entity_relations :-
    		extends_object(Prototype, Parent, Scope),
    		extends_protocol(Protocol1, Protocol2, Scope),
    		extends_category(Category1, Category2, Scope),
    		implements_protocol(Object, Protocol, Scope),
    		imports_category(Object, Category, Scope),
    		instantiates_class(Instance, Class, Scope),
    		specializes_class(Class, Superclass, Scope),
    		complements_object(Category, Object),
    		conforms_to_protocol(ObjOrCtg, Protocol, Scope).

    	event_handling :-
    		abolish_events(Event, Object, Message, Sender, Monitor),
    		current_event(Event, Object, Message, Sender, Monitor),
    		define_events(Event, Object, Message, Sender, Monitor).

    	multi_threading :-
    		threaded(Goals),
    		threaded_call(Goal),
    		threaded_call(Goal, Tag),
    		threaded_once(Goal),
    		threaded_once(Goal, Tag),
    		threaded_ignore(Goal),
    		threaded_exit(Goal),
    		threaded_exit(Goal, Tag),
    		threaded_peek(Goal),
    		threaded_peek(Goal, Tag),
    		threaded_cancel(Tag),
    		threaded_wait(Notification),
    		threaded_notify(Notification).

    	engines :-
    		threaded_engine(Engine),
    		threaded_engine_create(AnswerTemplate, Goal, Engine),
    		threaded_engine_destroy(Engine),
    		threaded_engine_self(Engine),
    		threaded_engine_next(Engine, Answer),
    		threaded_engine_next_reified(Engine, Answer),
    		threaded_engine_yield(Answer),
    		threaded_engine_post(Engine, Term),
    		threaded_engine_fetch(Term).

    	compiling_and_loading :-
    		logtalk_compile(File, Options),
    		logtalk_load(File, Options),
    		logtalk_library_path(Library, Path),
    		logtalk_load_context(Key, Value),
    		logtalk_make(Action),
    		logtalk_make,
    		logtalk_make_target_action(Target).

    	flags :-
    		current_logtalk_flag(Flag, Value),
    		set_logtalk_flag(Flag, Value),
    		create_logtalk_flag(Flag, Value, Options).

    	execution_context_methods :-
    		context(Context),
    		parameter(N, Parameter),
    		self(Self),
    		sender(Sender),
    		this(This).

    	reflection_methods :-
    		current_predicate(Predicate),
    		predicate_property(Predicate, Property).

    	database_methods :-
    		abolish(Name/Arity),
    		asserta(Clause),
    		assertz(Clause),
    		clause(Head, Body),
    		retract(Clause),
    		retractall(Head).

    	exception_methods :-
    		catch(Goal, Error, Catcher),
    		throw(Error),
    		instantiation_error,
    		type_error(Type, Culprit),
    		domain_error(Domain, Culprit),
    		existence_error(Thing, Culprit),
    		permission_error(Operation, Permission, Culprit),
    		representation_error(Flag),
    		evaluation_error(Exception),
    		resource_error(Resource),
    		syntax_error(Description),
    		system_error.

    	all_solutions_methods :-
    		bagof(Term, Goal, List),
    		bagof(Term, Var^Goal, List),
    		findall(Term, Goal, List),
    		forall(Generate, Test),
    		setof(Term, Goal, List),
    		setof(Term, Var1^Var2^Goal, List).

    	event_handler_methods :-
    		before(Object, Message, Sender),
    		after(Object, Message, Sender).

    	message_forwarding_method :-
    		forward(Message).

    	dcg_rules_parsing_methods :-
    		phrase(NonTerminal, Input, Rest).

    	term_expansion_methods :-
    		expand_term(Term, Expanded),
    		expand_goal(Goal, Expanded),
    		term_expansion(Term, Expanded),
    		goal_expansion(Goal, Expanded).

    	message_sending :-
    		Object::Message,
    		::Message,
    		^^Message.

    	calling_external_code :-
    		{goal1, goal2, goal3}.

    	context_switching_calls :-
    		Object<<Goal.

    	lambda_expressions :-
    		{X,Y,Z}/[P,Q]>>Goal.

    	explicitly_qualified_module_calls :-
    		Module:Goal.

    	if_then_else :-
    		(	If ->
    			Then
    		;	Else
    		).

    	numbers :-
    		X1 is 13, X2 is -13, X3 is +13,
    		Y1 is 13.13, Y2 is -13.13, Y3 is +13.13,
    		Z1 is 13.13e-23, Z2 is -13.13e-23, Z3 is +13.13e-23,
    		C1 is 0'A, C2 is 0'', C3 is 0'", C4 is 0'%,
    		C5 is 0'\n, C6 is 0'\\, C7 is 0'\', C8 is 0'\", C9 is 0'\`,
    		B1 is 0b1011101,
    		O1 is 0o1234560,
    		H1 is 0x1234567890abcDEF.

    	functions :-
    		A is atan(3.14) + atan2(1, 0) + acos(0.5) + asin(0.5) + sin(0.77) - cos(123.23) - tan(0.33),
    		B is sign(-12) * abs(35/78),
    		C is truncate(3.14) + round(-7.8) - ceiling(111.88),
    		D is exp(3.8) - log(123.98) / sqrt(33) * 23 ** 4 + 12345^2,
    		E is rem(3, 2) + mod(5, 3) - div(8, 4) * 2 rem 2 // 5 mod 3 - 8 div 4 + pi * e,
    		F is float_fractional_part(3.14) + float_integer_part(3.14),
    		G is float(33) + floor(99.99),
    		I is min(3,4) + max(4,5).

    	bitwise :-
    		A is 16 >> 2,
    		B is 16 << 2,
    		C is 10 /\ 12,
    		D is 10 \/ 12,
    		E is \ 10,
    		F is xor(13, 7).

    	term_unification :-
    		Term1 = Term2,
    		Term1 \= Term2,
    		unify_with_occurs_check(Term1, Term2),
    		subsumes_term(General, Specific).

    	term_testing :-
    		atom(Atom),
    		atomic(Atomic),
    		integer(Integer),
    		float(Float),
    		callable(Term),
    		compound(Term),
    		nonvar(Term),
    		var(Term),
    		number(Number),
    		ground(Term),
    		acyclic_term(Term).

    	term_comparison :-
    		compare(Order, Term1, Term2),
    		Term1 == Term2,
    		Term1 \== Term2,
    		Term1 @< Term2,
    		Term1 @=< Term2,
    		Term1 @>= Term2,
    		Term1 @> Term2.

    	term_creation_and_decomposition :-
    		functor(Term, Name, Arity),
    		arg(N, Term, Arg),
    		Term =.. [Functor| Args],
    		copy_term(Term, Copy),
    		numbervars(Term, Start, End),
    		term_variables(Term, Variables).

    	arithmetic_evaluation :-
    		X is Expression.

    	arithmetic_comparison :-
    		Exp1 =:= Exp2,
    		Exp1 =\= Exp2,
    		Exp1 < Exp2,
    		Exp1 =< Exp2,
    		Exp1 > Exp2,
    		Exp1 >= Exp2.

    	stream_selection_and_control :-
    		current_input(Stream),
    		current_output(Stream),
    		set_input(Stream),
    		set_output(Stream),
    		open(Source, Mode, Stream, Options),
    		close(Stream),
    		flush_output(Stream),
    		stream_property(Stream, Property),
    		at_end_of_stream(Stream),
    		set_stream_position(Stream, Position),
    		flush_output,
    		at_end_of_stream.

    	character_input_output :-
    		get_char(Char),
    		get_code(Code),
    		peek_char(Char),
    		peek_code(Code),
    		put_char(Char),
    		put_code(Code),
    		nl(Stream),
    		nl.

    	byte_input_output :-
    		get_byte(Byte),
    		peek_byte(Byte),
    		put_byte(Byte).

    	term_input_output :-
    		read(Term),
    		read_term(Stream, Term, Options),
    		write(Term),
    		write(Term),
    		write_canonical(Term),
    		write_term(Stream, Term, Options),
    		current_op(Precedence, Associativity, Operator),
    		op(Precedence, Associativity, Operator),
    		current_char_conversion(InChar, OutChar),
    		char_conversion(InChar, OutChar).

    	logic_and_control :-
    		\+ Goal,
    		call(Goal),
    		once(Goal),
    		ignore(Goal),
    		true,
    		fail,
    		false,
    		repeat,
    		!.

    	atomic_term_processing :-
    		atom_length(Atom, Length),
    		atom_chars(Atom, Chars),
    		atom_codes(Atom, Codes),
    		atom_concat(Atom1, Atom2, Atom),
    		sub_atom(Atom, Before, Length, After, SubAtom),
    		char_code(Char, Code),
    		number_chars(Number, Chars),
    		number_codes(Number, Codes).

    	implementation_defined_hooks :-
    		current_prolog_flag(Flag, Value),
    		set_prolog_flag(Flag, Value),
    		halt(ExitCode),
    		halt.

    	sorting :-
    		keysort(List, Sorted),
    		sort(List, Sorted).

    	number(C) --> "+", number(C).
    	number(C) --> "-", number(X), {C is -X}.
    	number(X) --> [C], {0'0 =< C, C =< 0'9, X is C - 0'0}.

    	escape_sequences :-
    		write('Quoted atom with a quote ('') inside.'),
    		write('Quoted atom with a quote (\') inside using a control escape sequence.'),
    		write('Quoted atom with a backslash (\\) inside.'),
    		write('Quoted atom with control escape sequences: \a \b \r \f \t \n \v'),
    		write('Quoted atom with an octal escape sequence: \123\.'),
    		write('Quoted atom with an hexadecimal escape sequence: \x123f\.').

    	% nothing in the following predicate definition should be highlighted
    	sort :-
    		forall,
    		object,
    		write,
    		number.

    :- end_object.

    :- object(class,
    	implements(protected::protocol),
    	imports(private::category),
    	instantiates(metaclass),
    	specializes(superclass)).

    :- end_object.

    :- object(parametric(Parameter, "String", 33.78),
    	implements(protocol),
    	imports(category),
    	extends(parent(Parameter))).

    :- end_object.

    :- category(category,
    	implements(protocol),
    	extends(other_category)).

    :- end_category.

    :- protocol(extended,
    	extends(minimal)).

    :- end_protocol.

    :- module(module, [foo/1, bar/2]).

    :- use_module(library).
    :- use_module(library, [baz/3]).

    :- reexport(library).
    :- reexport(library, [qux/4]).

    :- export(quux/5).