Logtalk reference manual
Grammar
Grammar
The Logtalk grammar is here described using Backus-Naur Form syntax. Non-terminal symbols in italics have the definition found in the ISO Prolog Standard. Terminal symbols are represented in a fixed width font
and between "".
Compilation units
- entity ::=
- object |
- category |
- protocol
Object definition
- object ::=
- begin_object_directive [object_directives] [clauses] end_object_directive.
- begin_object_directive ::=
- "
:- object(
" object_identifier [ ",
" object_relations] ").
"
- end_object_directive ::=
- "
:- end_object.
"
- object_relations ::=
- prototype_relations |
- non_prototype_relations
- prototype_relations ::=
- prototype_relation |
- prototype_relation "
,
" prototype_relations
- prototype_relation ::=
- implements_protocols |
- imports_categories |
- extends_objects
- non_prototype_relations ::=
- non_prototype_relation |
- non_prototype_relation "
,
" non_prototype_relations
- non_prototype_relation ::=
- implements_protocols |
- imports_categories |
- instantiates_classes |
- specializes_classes
Category definition
- category ::=
- begin_category_directive [category_directives] [clauses] end_category_directive.
- begin_category_directive ::=
- "
:- category(
" category_identifier [ ",
" category_relations] ").
"
- end_category_directive ::=
- "
:- end_category.
"
- category_relations ::=
- category_relation |
- category_relation "
,
" category_relations
- category_relation ::=
- implements_protocols |
- extends_categories |
- complements_objects
Protocol definition
- protocol ::=
- begin_protocol_directive [protocol_directives] end_protocol_directive.
- begin_protocol_directive ::=
- "
:- protocol(
" protocol_identifier [ ",
" extends_protocols] ").
"
- end_protocol_directive ::=
- "
:- end_protocol.
"
Entity relations
- extends_protocols ::=
- "
extends(
" extended_protocols ")
"
- extends_objects ::=
- "
extends(
" extended_objects ")
"
- extends_categories ::=
- "
extends(
" extended_categories ")
"
- implements_protocols ::=
- "
implements(
" implemented_protocols ")
"
- imports_categories ::=
- "
imports(
" imported_categories ")
"
- instantiates_classes ::=
- "
instantiates(
" instantiated_objects ")
"
- specializes_classes ::=
- "
specializes(
" specialized_objects ")
"
- complements_objects ::=
- "
complements(
" complemented_objects ")
"
Implemented protocols
- implemented_protocols ::=
- implemented_protocol |
- implemented_protocol_sequence |
- implemented_protocol_list
- implemented_protocol ::=
- protocol_identifier |
- scope "
::
" protocol_identifier
- implemented_protocol_sequence ::=
- implemented_protocol |
- implemented_protocol "
,
" implemented_protocol_sequence
- implemented_protocol_list ::=
- "
[
" implemented_protocol_sequence "]
"
Extended protocols
- extended_protocols ::=
- extended_protocol |
- extended_protocol_sequence |
- extended_protocol_list
- extended_protocol ::=
- protocol_identifier |
- scope "
::
" protocol_identifier
- extended_protocol_sequence ::=
- extended_protocol |
- extended_protocol "
,
" extended_protocol_sequence
- extended_protocol_list ::=
- "
[
" extended_protocol_sequence "]
"
Imported categories
- imported_categories ::=
- imported_category |
- imported_category_sequence |
- imported_category_list
- imported_category ::=
- category_identifier |
- scope "
::
" category_identifier
- imported_category_sequence ::=
- imported_category |
- imported_category "
,
" imported_category_sequence
- imported_category_list ::=
- "
[
" imported_category_sequence "]
"
Extended objects
- extended_objects ::=
- extended_object |
- extended_object_sequence |
- extended_object_list
- extended_object ::=
- object_identifier |
- scope "
::
" object_identifier
- extended_object_sequence ::=
- extended_object |
- extended_object "
,
" extended_object_sequence
- extended_object_list ::=
- "
[
" extended_object_sequence "]
"
Extended categories
- extended_categories ::=
- extended_category |
- extended_category_sequence |
- extended_category_list
- extended_category ::=
- category_identifier |
- scope "
::
" category_identifier
- extended_category_sequence ::=
- extended_category |
- extended_category "
,
" extended_category_sequence
- extended_category_list ::=
- "
[
" extended_category_sequence "]
"
Instantiated objects
- instantiated_objects ::=
- instantiated_object |
- instantiated_object_sequence |
- instantiated_object_list
- instantiated_object ::=
- object_identifier |
- scope "
::
" object_identifier
- instantiated_object_sequence ::=
- instantiated_object
- instantiated_object "
,
" instantiated_object_sequence |
- instantiated_object_list ::=
- "
[
" instantiated_object_sequence "]
"
Specialized objects
- specialized_objects ::=
- specialized_object |
- specialized_object_sequence |
- specialized_object_list
- specialized_object ::=
- object_identifier |
- scope "
::
" object_identifier
- specialized_object_sequence ::=
- specialized_object |
- specialized_object "
,
" specialized_object_sequence
- specialized_object_list ::=
- "
[
" specialized_object_sequence "]
"
Complemented objects
- complemented_objects ::=
- object_identifier |
- complemented_object_sequence |
- complemented_object_list
- complemented_object_sequence ::=
- object_identifier |
- object_identifier "
,
" complemented_object_sequence
- complemented_object_list ::=
- "
[
" complemented_object_sequence "]
"
Entity scope
- scope ::=
- "
public
" |
- "
protected
" |
- "
private
"
Entity identifiers
- entity_identifiers ::=
- entity_identifier |
- entity_identifier_sequence |
- entity_identifier_list
- entity_identifier ::=
- object_identifier |
- protocol_identifier |
- category_identifier
- entity_identifier_sequence ::=
- entity_identifier |
- entity_identifier "
,
" entity_identifier_sequence
- entity_identifier_list ::=
- "
[
" entity_identifier_sequence "]
"
Object identifiers
- object_identifiers ::=
- object_identifier |
- object_identifier_sequence |
- object_identifier_list
- object_identifier ::=
- atom |
- compound
- object_identifier_sequence ::=
- object_identifier |
- object_identifier "
,
" object_identifier_sequence
- object_identifier_list ::=
- "
[
" object_identifier_sequence "]
"
Category identifiers
- category_identifiers ::=
- category_identifier |
- category_identifier_sequence |
- category_identifier_list
- category_identifier ::=
- atom |
- compound
- category_identifier_sequence ::=
- category_identifier |
- category_identifier "
,
" category_identifier_sequence
- category_identifier_list ::=
- "
[
" category_identifier_sequence "]
"
Protocol identifiers
- protocol_identifiers ::=
- protocol_identifier |
- protocol_identifier_sequence |
- protocol_identifier_list
- protocol_identifier ::=
- atom
- protocol_identifier_sequence ::=
- protocol_identifier |
- protocol_identifier "
,
" protocol_identifier_sequence
- protocol_identifier_list ::=
- "
[
" protocol_identifier_sequence "]
"
Source file names
- source_file_names ::=
- source_file_name |
- source_file_name_list
- source_file_name ::=
- atom |
- library_source_file_name
- library_source_file_name ::=
- library_name "
(
" atom ")
"
- library_name ::=
- atom
- source_file_name_sequence ::=
- source_file_name |
- source_file_name "
,
" source_file_name_sequence
- source_file_name_list ::=
- "
[
" source_file_name_sequence "]
"
Directives
Source file directives
- source_file_directives ::=
- source_file_directive |
- source_file_directive source_file_directives
- source_file_directive ::=
- "
:- encoding(
" atom ").
" |
- "
:- set_logtalk_flag(
" atom ",
" nonvar ").
" |
- initialization_directive |
- operator_directive
Conditional compilation directives
- conditional_compilation_directives ::=
- conditional_compilation_directive |
- conditional_compilation_directive conditional_compilation_directives
- conditional_compilation_directive ::=
- "
:- if(
" callable ").
" |
- "
:- elif(
" callable ").
" |
- "
:- else.
" |
- "
:- endif.
"
Object directives
- object_directives ::=
- object_directive |
- object_directive object_directives
- object_directive ::=
- initialization_directive |
- "
:- threaded.
" |
- "
:- synchronized.
" |
- "
:- dynamic.
" |
- "
:- uses(
" object_identifier ").
" |
- "
:- calls(
" protocol_identifiers ").
" |
- "
:- info(
" info_list ").
" |
- predicate_directives
Category directives
- category_directives ::=
- category_directive |
- category_directive category_directives
- category_directive ::=
- initialization_directive |
- "
:- synchronized.
" |
- "
:- dynamic.
" |
- "
:- uses(
" object_identifier ").
" |
- "
:- calls(
" protocol_identifiers ").
" |
- "
:- info(
" info_list ").
" |
- predicate_directives
Protocol directives
- protocol_directives ::=
- protocol_directive |
- protocol_directive protocol_directives
- protocol_directive ::=
- initialization_directive |
- "
:- dynamic.
" |
- "
:- info(
" info_list ").
" |
- predicate_directives
Predicate directives
- predicate_directives ::=
- predicate_directive |
- predicate_directive predicate_directives
- predicate_directive ::=
- alias_directive |
- synchronized_directive |
- uses_directive |
- scope_directive |
- mode_directive |
- meta_predicate_directive |
- annotation_directive |
- info_directive |
- dynamic_directive |
- discontiguous_directive |
- multifile_directive |
- coinductive_directive |
- operator_directive
- alias_directive ::=
- "
:- alias(
" entity_identifier ",
" predicate_indicator ",
" predicate_indicator ").
" |
- "
:- alias(
" entity_identifier ",
" non_terminal_indicator ",
" non_terminal_indicator ").
"
- synchronized_directive ::=
- "
:- synchronized(
" predicate_indicator ").
" |
- "
:- synchronized(
" non_terminal_indicator ").
"
- uses_directive ::=
- "
:- uses(
" object_identifier ",
" predicate_indicator_alias_list ").
"
- scope_directive ::=
- "
:- public(
" predicate_indicator_term | non_terminal_indicator_term ").
" |
- "
:- protected(
" predicate_indicator_term | non_terminal_indicator_term ").
" |
- "
:- private(
" predicate_indicator_term | non_terminal_indicator_term ").
"
- mode_directive ::=
- "
:- mode(
" predicate_mode_term | non_terminal_mode_term ",
" number_of_solutions ").
"
- meta_predicate_directive ::=
- "
:- meta_predicate(
" meta_predicate_template_term ").
"
- annotation_directive ::=
- "
:- annotation(
" annotation_template_term ").
"
- info_directive ::=
- "
:- info(
" predicate_indicator | non_terminal_indicator ",
" info_list ").
"
- dynamic_directive ::=
- "
:- dynamic(
" predicate_indicator_term | non_terminal_indicator_term ").
" |
- discontiguous_directive ::=
- "
:- discontiguous(
" predicate_indicator_term | non_terminal_indicator_term ").
" |
- multifile_directive ::=
- "
:- multifile(
" predicate_indicator_term ").
" |
- coinductive_directive ::=
- "
:- coinductive(
" predicate_indicator_term ").
" |
- predicate_indicator_term ::=
- predicate_indicator |
- predicate_indicator_sequence |
- predicate_indicator_list
- predicate_indicator_sequence ::=
- predicate_indicator |
- predicate_indicator "
,
" predicate_indicator_sequence
- predicate_indicator_list ::=
- "
[
" predicate_indicator_sequence "]
"
- predicate_indicator_alias ::=
- predicate_indicator |
- predicate_indicator "
::
" predicate_indicator
- predicate_indicator_alias_sequence ::=
- predicate_indicator_alias |
- predicate_indicator_alias "
,
" predicate_indicator_alias_sequence
- predicate_indicator_alias_list ::=
- "
[
" predicate_indicator_alias_sequence "]
"
- non_terminal_indicator_term ::=
- non_terminal_indicator |
- non_terminal_indicator_sequence |
- non_terminal_indicator_list
- non_terminal_indicator_sequence ::=
- non_terminal_indicator |
- non_terminal_indicator "
,
" non_terminal_indicator_sequence
- non_terminal_indicator_list ::=
- "
[
" non_terminal_indicator_sequence "]
"
- non_terminal_indicator ::=
- functor "
//
" arity
- non_terminal_indicator_alias ::=
- non_terminal_indicator |
- non_terminal_indicator "
::
" non_terminal_indicator
- non_terminal_indicator_alias_sequence ::=
- non_terminal_indicator_alias |
- non_terminal_indicator_alias "
,
" non_terminal_indicator_alias_sequence
- non_terminal_indicator_alias_list ::=
- "
[
" non_terminal_indicator_alias_sequence "]
"
- predicate_mode_term ::=
- atom "
(
" mode_terms ")
"
- non_terminal_mode_term ::=
- atom "
(
" mode_terms ")
"
- mode_terms ::=
- mode_term |
- mode_term "
,
" mode_terms
- mode_term ::=
- "
@
" [type] | "+
" [type] | "-
" [type] | "?
" [type]
- type ::=
- prolog_type | logtalk_type | user_defined_type
- prolog_type ::=
- "
term
" | "nonvar
" | "var
" |
- "
compound
" | "ground
" | "callable
" | "list
" |
- "
atomic
" | "atom
" |
- "
number
" | "integer
" | "float
"
- logtalk_type ::=
- "
object
" | "category
" | "protocol
" |
- "
event
"
- user_defined_type ::=
- atom |
- compound
- number_of_solutions ::=
- "
zero
" | "zero_or_one
" | "zero_or_more
" | "one
" | "one_or_more
" | "error
"
- meta_predicate_template_term ::=
- meta_predicate_template |
- meta_predicate_template_sequence |
- meta_predicate_template_list
- meta_predicate_template_sequence ::=
- meta_predicate_template |
- meta_predicate_template "
,
" meta_predicate_template_sequence
- meta_predicate_template_list ::=
- "
[
" meta_predicate_template_sequence "]
"
- meta_predicate_template ::=
- object_identifier "
::
" atom "(
" meta_predicate_terms ")
" |
- category_identifier "
::
" atom "(
" meta_predicate_terms ")
" |
- atom "
(
" meta_predicate_terms ")
"
- meta_predicate_terms ::=
- meta_predicate_term |
- meta_predicate_term "
,
" meta_predicate_terms
- meta_predicate_term ::=
- "
::
" | "*
" | "/
" | integer |
- "
[0]
" | "[/]
"
- annotation_template_term ::=
- annotation_template |
- annotation_template_sequence |
- annotation_template_list
- annotation_template_sequence ::=
- annotation_template |
- annotation_template "
,
" annotation_template_sequence
- annotation_template_list ::=
- "
[
" annotation_template_sequence "]
"
- annotation_template ::=
- atom "
(
" annotation_terms ")
"
- annotation_terms ::=
- annotation_term |
- annotation_term "
,
" annotation_terms
- annotation_term ::=
- "
0
" | "*
"
- info_list ::=
- "
[]
" |
- "
[
" info_item "is
" nonvar "|
" info_list "]
"
- info_item ::=
- "
comment
" | "remarks
" |
- "
author
" | "version
" | "date
" |
- "
copyright
" | "license
" |
- "
parameters
" | "parnames
" |
- "
arguments
" | "argnames
" |
- "
definition
" | "redefinition
" | "allocation
" |
- "
examples
" | "exceptions
" |
- atom
Clauses and goals
- clause ::=
- object_identifier "
::
" head ":-
" body |
- head :- body |
- fact
- goal ::=
- message_call |
- external_call |
- direct_call |
- context_call |
- callable
- message_call ::=
- message_to_object |
- message_to_self |
- message_to_super
- message_to_object ::=
- receiver "
::
" messages
- message_to_self ::=
- "
::
" messages
- message_to_super ::=
- "
^^
" message
- messages ::=
- message |
- "
(
" message ",
" messages ")
" |
- "
(
" message ";
" messages ")
" |
- "
(
" message "->
" messages ")
"
- message ::=
- callable |
- variable
- receiver ::=
- "
{
" callable "}
" |
- object_identifier |
- variable
- external_call ::=
- "
{
" callable "}
"
- direct_call ::=
- "
:
" message
- context_call ::=
- object_identifier "
<<
" goal
Lambda expressions
- lambda_expression ::=
- lambda_free_variables "
/
" lambda_parameters ">>
" callable |
- lambda_free_variables "
/
" callable |
- lambda_parameters "
>>
" callable
- lambda_free_variables ::=
- "
{
" conjunction of variables "}
" |
- "
{
" variable "}
" |
- "
{}
"
- lambda_parameters ::=
- list of terms |
- "
[]
"
Entity properties
- category_property ::=
- "
static
" |
- "
dynamic
" |
- "
built_in
" |
- "
synchronized
" |
- "
file(
" atom ",
" atom ")
" |
- "
lines(
" integer ",
" integer ")
" |
- "
events
" |
- "
public(
" predicate_indicator_list ")
" |
- "
parameter_names(
" list of atoms ")
"
- object_property ::=
- "
static
" |
- "
dynamic
" |
- "
built_in
" |
- "
synchronized
" |
- "
threaded
" |
- "
file(
" atom ",
" atom ")
" |
- "
lines(
" integer ",
" integer ")
" |
- "
context_switching_calls
" |
- "
dynamic_declarations
" |
- "
events
" |
- "
complements
" |
- "
public(
" predicate_indicator_list ")
" |
- "
parameter_names(
" list of atoms ")
"
- protocol_property ::=
- "
static
" |
- "
dynamic
" |
- "
built_in
" |
- "
file(
" atom ",
" atom ")
" |
- "
lines(
" integer ",
" integer ")
" |
- "
public(
" predicate_indicator_list ")
"
Predicate properties
- predicate_property ::=
- "
static
" | "dynamic
" |
- "
private
" | "protected
" | "public
" |
- "
logtalk
" | "prolog
" |
- "
coinductive
" |
- "
multifile
" |
- "
synchronized
" |
- "
built_in
" |
- "
declared_in(
" entity_identifier ")
" |
- "
defined_in(
" object_identifier | category_identifier ")
" |
- "
meta_predicate(
" meta_predicate_template ")
" |
- "
alias_of(
" callable ")
" |
- "
non_terminal(
" non_terminal_indicator ")
"