Grammar

The Logtalk grammar is here described using W3C-style Extended Backus-Naur Form syntax. Non-terminal symbols not defined here can be found in the ISO Prolog Core standard. Terminal symbols are represented between double-quotes.

Entities

entity ::=
   object
   | category
   | protocol

Object definition

object ::=
   begin_object_directive ( object_term )* 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_term )* 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_directive )* 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 and predicate scope

scope ::=
   "public"
   | "protected"
   | "private"

Entity identifiers

entity_identifier ::=
   object_identifier
   | protocol_identifier
   | category_identifier

Object identifiers

object_identifier ::=
   atom
   | compound

Category identifiers

category_identifier ::=
   atom
   | compound

Protocol identifiers

protocol_identifier ::=
   atom

Module identifiers

module_identifier ::=
   atom

Source files

source_file ::=
   ( source_file_content )*

source_file_content ::=
   source_file_directive
   | clause
   | grammar_rule
   | entity

Source file names

source_file_name ::=
   atom
   | library_source_file_name

library_source_file_name ::=
   library_name "(" atom ")"

library_name ::=
   atom

Terms

Object terms

object_term ::=
   object_directive
   | clause
   | grammar_rule

Category terms

category_term ::=
   category_directive
   | clause
   | grammar_rule

Directives

Source file directives

source_file_directive ::=
   ":- encoding(" atom ")."
   | ":- set_logtalk_flag(" atom "," nonvar ")."
   | ":- include(" source_file_name ")."
   | prolog_directive

Conditional compilation directives

conditional_compilation_directive ::=
   ":- if(" callable ")."
   | ":- elif(" callable ")."
   | ":- else."
   | ":- endif."

Object directives

object_directive ::=
   ":- initialization(" callable ")."
   | ":- built_in."
   | ":- threaded."
   | ":- dynamic."
   | ":- info(" entity_info_list ")."
   | ":- set_logtalk_flag(" atom "," nonvar ")."
   | ":- include(" source_file_name ")."
   | ":- uses(" object_alias_list ")."
   | ":- use_module(" module_alias_list ")."
   | conditional_compilation_directive
   | predicate_directive

Category directives

category_directive ::=
   ":- built_in."
   | ":- dynamic."
   | ":- info(" entity_info_list ")."
   | ":- set_logtalk_flag(" atom "," nonvar ")."
   | ":- include(" source_file_name ")."
   | ":- uses(" object_alias_list ")."
   | ":- use_module(" module_alias_list ")."
   | conditional_compilation_directive
   | predicate_directive

Protocol directives

protocol_directive ::=
   ":- built_in."
   | ":- dynamic."
   | ":- info(" entity_info_list ")."
   | ":- set_logtalk_flag(" atom "," nonvar ")."
   | ":- include(" source_file_name ")."
   | conditional_compilation_directive
   | predicate_directive

Predicate directives

predicate_directive ::=
   alias_directive
   | synchronized_directive
   | uses_directive
   | use_module_directive
   | scope_directive
   | mode_directive
   | meta_predicate_directive
   | meta_non_terminal_directive
   | info_directive
   | dynamic_directive
   | discontiguous_directive
   | multifile_directive
   | coinductive_directive
   | operator_directive

alias_directive ::=
   ":- alias(" entity_identifier "," alias_directive_resource_list ")."

synchronized_directive ::=
   ":- synchronized(" synchronized_directive_resource_term ")."

uses_directive ::=
   ":- uses(" ( object_identifier | parameter_variable ) "," uses_directive_resource_list ")."

use_module_directive ::=
   ":- use_module(" ( module_identifier | parameter_variable ) "," use_module_directive_resource_list ")."

scope_directive ::=
   ":- public(" scope_directive_resource_term ")."
   | ":- protected(" scope_directive_resource_term ")."
   | ":- private(" scope_directive_resource_term ")."

mode_directive ::=
   ":- mode(" ( predicate_mode_term | non_terminal_mode_term ) "," number_of_proofs ")."

meta_predicate_directive ::=
   ":- meta_predicate(" meta_predicate_template_term ")."

meta_non_terminal_directive ::=
   ":- meta_non_terminal(" meta_non_terminal_template_term ")."

info_directive ::=
   ":- info(" ( predicate_indicator | non_terminal_indicator ) "," predicate_info_list ")."

dynamic_directive ::=
   ":- dynamic(" qualified_directive_resource_term ")."

discontiguous_directive ::=
   ":- discontiguous(" qualified_directive_resource_term ")."

multifile_directive ::=
   ":- multifile(" qualified_directive_resource_term ")."

coinductive_directive ::=
   ":- coinductive(" ( predicate_indicator_term | coinductive_predicate_template_term ) ")."

parameter_variable ::=
   _variable_

scope_directive_resource_term ::=
   scope_directive_resource
   | scope_directive_resource_sequence
   | scope_directive_resource_list

scope_directive_resource ::=
   predicate_indicator
   | non_terminal_indicator
   | operator

scope_directive_resource_sequence ::=
   scope_directive_resource
   | scope_directive_resource "," scope_directive_resource_sequence

scope_directive_resource_list ::=
     "[" scope_directive_resource_sequence "]"

entity_resources_list ::=
   predicate_indicator_list
   | operator_list

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 "]"

alias_directive_resource_list ::=
   "[" alias_directive_resource_sequence "]"

alias_directive_resource_sequence ::=
   alias_directive_resource
   | alias_directive_resource "," alias_directive_resource_sequence

alias_directive_resource ::=
   predicate_indicator_alias
   | non_terminal_indicator_alias

synchronized_directive_resource_term ::=
   synchronized_directive_resource
   | synchronized_directive_resource_sequence
   | synchronized_directive_resource_list

synchronized_directive_resource ::=
   predicate_indicator
   | non_terminal_indicator

synchronized_directive_resource_sequence ::=
   synchronized_directive_resource
   | synchronized_directive_resource "," synchronized_directive_resource_sequence

synchronized_directive_resource_list ::=
   "[" synchronized_directive_resource_sequence "]"

uses_directive_resource_list ::=
   "[" uses_directive_resource_sequence "]"

uses_directive_resource_sequence ::=
   uses_directive_resource
   | uses_directive_resource "," uses_directive_resource_sequence

uses_directive_resource ::=
   predicate_indicator
   | non_terminal_indicator
   | predicate_template_alias
   | operator

use_module_directive_resource_list ::=
   "[" use_module_directive_resource_sequence "]"

use_module_directive_resource_sequence ::=
   use_module_directive_resource
   | use_module_directive_resource "," use_module_directive_resource_sequence

use_module_directive_resource ::=
   predicate_indicator
   | non_terminal_indicator
   | predicate_template_alias
   | operator

qualified_directive_resource_term ::=
   qualified_directive_resource
   | qualified_directive_resource_sequence
   | qualified_directive_resource_list

qualified_directive_resource_sequence ::=
   qualified_directive_resource
   | qualified_directive_resource "," qualified_directive_resource_sequence

qualified_directive_resource_list ::=
   "[" qualified_directive_resource_sequence "]"

qualified_directive_resource ::=
   predicate_indicator
   | non_terminal_indicator
   | object_identifier "::" ( predicate_indicator | non_terminal_indicator)
   | category_identifier "::" ( predicate_indicator | non_terminal_indicator)
   | module_identifier ":" ( predicate_indicator | non_terminal_indicator)

predicate_indicator_alias ::=
   predicate_indicator "as" predicate_indicator

predicate_template_alias ::=
   callable "as" callable

non_terminal_indicator ::=
   functor "//" arity

non_terminal_indicator_alias ::=
   non_terminal_indicator "as" non_terminal_indicator

operator_sequence ::=
   operator specification
   | operator specification "," operator_sequence

operator_list ::=
   "[" operator_sequence "]"

coinductive_predicate_template_term ::=
   coinductive_predicate_template
   | coinductive_predicate_template_sequence
   | coinductive_predicate_template_list

coinductive_predicate_template_sequence ::=
   coinductive_predicate_template
   | coinductive_predicate_template "," coinductive_predicate_template_sequence

coinductive_predicate_template_list ::=
   "[" coinductive_predicate_template_sequence "]"

coinductive_predicate_template ::=
   atom "(" coinductive_mode_terms ")"

coinductive_mode_terms ::=
   coinductive_mode_term
   | coinductive_mode_terms "," coinductive_mode_terms

coinductive_mode_term ::=
   "+"
   | "-"

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?
   | "--" 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_proofs ::=
   "zero"
   | "zero_or_one"
   | "zero_or_more"
   | "one"
   | "one_or_more"
   | "zero_or_error"
   | "one_or_error"
   | "zero_or_one_or_error"
   | "zero_or_more_or_error"
   | "one_or_more_or_error"
   | "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_specifiers ")"
   | category_identifier "::" atom "(" meta_predicate_specifiers ")"
   | module_identifier ":" atom "(" meta_predicate_specifiers ")"
   | atom "(" meta_predicate_specifiers ")"

meta_predicate_specifiers ::=
   meta_predicate_specifier
   | meta_predicate_specifier "," meta_predicate_specifiers

meta_predicate_specifier ::=
   non_negative_integer
   | "::"
   | "^"
   | "*"

meta_non_terminal_template_term ::=
   meta_predicate_template_term

entity_info_list ::=
   "[" entity_info_sequence? "]"

entity_info_sequence ::=
   entity_info_item "is" nonvar
   | entity_info_item "is" nonvar "," entity_info_sequence

entity_info_item ::=
   "comment"
   | "remarks"
   | "author"
   | "version"
   | "date"
   | "copyright"
   | "license"
   | "parameters"
   | "parnames"
   | "see_also"
   | atom

predicate_info_list ::=
   "[" predicate_info_sequence? "]"

predicate_info_sequence ::=
   predicate_info_item "is" nonvar
   | predicate_info_item "is" nonvar "," predicate_info_sequence

predicate_info_item ::=
   "comment"
   | "remarks"
   | "arguments"
   | "argnames"
   | "redefinition"
   | "allocation"
   | "examples"
   | "exceptions"
   | "see_also"
   | atom

object_alias_list ::=
   "[" object_alias_sequence "]"

object_alias_sequence ::=
   object_alias
   | object_alias "," object_alias_sequence

object_alias ::=
   object_identifier "as" object_identifier

module_alias_list ::=
   "[" module_alias_sequence "]"

module_alias_sequence ::=
   module_alias
   | module_alias "," module_alias_sequence

module_alias ::=
   module_identifier "as" module_identifier

Clauses and goals

clause ::=
   object_identifier "::" head ":-" body
   | module_identifier ":" head ":-" body
   | head ":-" body
   | object_identifier "::" fact
   | module_identifier ":" fact
   | fact

goal ::=
   message_sending
   | super_call
   | external_call
   | context_switching_call
   | callable

message_sending ::=
   message_to_object
   | message_delegation
   | message_to_self

message_to_object ::=
   receiver "::" messages

message_delegation ::=
   "[" message_to_object "]"

message_to_self ::=
   "::" messages

super_call ::=
   "^^" message

messages ::=
   message
   | "(" message "," messages ")"
   | "(" message ";" messages ")"
   | "(" message "->" messages ")"

message ::=
   callable
   | variable

receiver ::=
   "{" callable "}"
   | object_identifier
   | variable

external_call ::=
   "{" callable "}"

context_switching_call ::=
   object_identifier "<<" callable

Lambda expressions

lambda_expression ::=
   lambda_free_variables "/" lambda_parameters ">>" callable
   | lambda_free_variables "/" callable
   | lambda_parameters ">>" callable

lambda_free_variables ::=
   "{" variables? "}"

lambda_parameters ::=
   "[" terms? "]"

variables ::=
   variable
   | variable "," variables

terms ::=
   term
   | term "," terms

Entity properties

category_property ::=
   "static"
   | "dynamic"
   | "built_in"
   | "file(" atom ")"
   | "file(" atom "," atom ")"
   | "lines(" integer "," integer ")"
   | "events"
   | "source_data"
   | "public(" entity_resources_list ")"
   | "protected(" entity_resources_list ")"
   | "private(" entity_resources_list ")"
   | "declares(" predicate_indicator "," predicate_declaration_property_list ")"
   | "defines(" predicate_indicator "," predicate_definition_property_list ")"
   | "includes(" predicate_indicator "," ( object_identifier | category_identifier ) "," predicate_definition_property_list ")"
   | "provides(" predicate_indicator "," ( object_identifier | category_identifier ) "," predicate_definition_property_list ")"
   | "alias(" predicate_indicator "," predicate_alias_property_list ")"
   | "calls(" predicate "," predicate_call_update_property_list ")"
   | "updates(" predicate "," predicate_call_update_property_list ")"
   | "number_of_clauses(" integer ")"
   | "number_of_rules(" integer ")"
   | "number_of_user_clauses(" integer ")"
   | "number_of_user_rules(" integer ")"
   | "debugging"

object_property ::=
   "static"
   | "dynamic"
   | "built_in"
   | "threaded"
   | "file(" atom ")"
   | "file(" atom "," atom ")"
   | "lines(" integer "," integer ")"
   | "context_switching_calls"
   | "dynamic_declarations"
   | "events"
   | "source_data"
   | "complements(" ( "allow" | "restrict" ) ")"
   | "complements"
   | "public(" entity_resources_list ")"
   | "protected(" entity_resources_list ")"
   | "private(" entity_resources_list ")"
   | "declares(" predicate_indicator "," predicate_declaration_property_list ")"
   | "defines(" predicate_indicator "," predicate_definition_property_list ")"
   | "includes(" predicate_indicator "," ( object_identifier | category_identifier ) "," predicate_definition_property_list ")"
   | "provides(" predicate_indicator "," ( object_identifier | category_identifier ) "," predicate_definition_property_list ")"
   | "alias(" predicate_indicator "," predicate_alias_property_list ")"
   | "calls(" predicate "," predicate_call_update_property_list ")"
   | "updates(" predicate "," predicate_call_update_property_list ")"
   | "number_of_clauses(" integer ")"
   | "number_of_rules(" integer ")"
   | "number_of_user_clauses(" integer ")"
   | "number_of_user_rules(" integer ")"
   | "module"
   | "debugging"

protocol_property ::=
   "static"
   | "dynamic"
   | "built_in"
   | "source_data"
   | "file(" atom ")"
   | "file(" atom "," atom ")"
   | "lines(" integer "," integer ")"
   | "public(" entity_resources_list ")"
   | "protected(" entity_resources_list ")"
   | "private(" entity_resources_list ")"
   | "declares(" predicate_indicator "," predicate_declaration_property_list ")"
   | "alias(" predicate_indicator "," predicate_alias_property_list ")"
   | "debugging"

predicate_declaration_property_list ::=
   "[" predicate_declaration_property_sequence "]"

predicate_declaration_property_sequence ::=
   predicate_declaration_property
   | predicate_declaration_property "," predicate_declaration_property_sequence

predicate_declaration_property ::=
   "static"
   | "dynamic"
   | "scope(" scope ")"
   | "private"
   | "protected"
   | "public"
   | "coinductive"
   | "multifile"
   | "synchronized"
   | "meta_predicate(" meta_predicate_template ")"
   | "coinductive(" coinductive_predicate_template ")"
   | "non_terminal(" non_terminal_indicator ")"
   | "include(" atom ")"
   | "line_count(" integer ")"
   | "mode(" ( predicate_mode_term | non_terminal_mode_term ) "," number_of_proofs ")"
   | "info(" list ")"

predicate_definition_property_list ::=
   "[" predicate_definition_property_sequence "]"

predicate_definition_property_sequence ::=
   predicate_definition_property
   | predicate_definition_property "," predicate_definition_property_sequence

predicate_definition_property ::=
   "inline"
   | "auxiliary"
   | "non_terminal(" non_terminal_indicator ")"
   | "include(" atom ")"
   | "line_count(" integer ")"
   | "number_of_clauses(" integer ")"
   | "number_of_rules(" integer ")"

predicate_alias_property_list ::=
   "[" predicate_alias_property_sequence "]"

predicate_alias_property_sequence ::=
   predicate_alias_property
   | predicate_alias_property "," predicate_alias_property_sequence

predicate_alias_property ::=
   "for(" predicate_indicator ")"
   | "from(" entity_identifier ")"
   | "non_terminal(" non_terminal_indicator ")"
   | "include(" atom ")"
   | "line_count(" integer ")"

predicate ::=
   predicate_indicator
   | "^^" predicate_indicator
   | "::" predicate_indicator
   | ( variable | object_identifier ) "::" predicate_indicator
   | ( variable | module_identifier ) ":" predicate_indicator

predicate_call_update_property_list ::=
   "[" predicate_call_update_property_sequence "]"

predicate_call_update_property_sequence ::=
   predicate_call_update_property
   | predicate_call_update_property "," predicate_call_update_property_sequence

predicate_call_update_property ::=
   "caller(" predicate_indicator ")"
   | "include(" atom ")"
   | "line_count(" integer ")"
   | "as(" predicate_indicator ")"

Predicate properties

predicate_property ::=
   "static"
   | "dynamic"
   | "scope(" scope ")"
   | "private"
   | "protected"
   | "public"
   | "logtalk"
   | "prolog"
   | "foreign"
   | "coinductive(" coinductive_predicate_template ")"
   | "multifile"
   | "synchronized"
   | "built_in"
   | "inline"
   | "declared_in(" entity_identifier ")"
   | "defined_in(" ( object_identifier | category_identifier ) ")"
   | "redefined_from(" ( object_identifier | category_identifier ) ")"
   | "meta_predicate(" meta_predicate_template ")"
   | "alias_of(" callable ")"
   | "alias_declared_in(" entity_identifier ")"
   | "non_terminal(" non_terminal_indicator ")"
   | "mode(" ( predicate_mode_term | non_terminal_mode_term ) "," number_of_proofs ")"
   | "info(" list ")"
   | "number_of_clauses(" integer ")"
   | "number_of_rules(" integer ")"
   | "declared_in(" entity_identifier "," line_count ")"
   | "defined_in(" ( object_identifier | category_identifier ) "," line_count ")"
   | "redefined_from(" ( object_identifier | category_identifier ) "," line_count ")"
   | "alias_declared_in(" entity_identifier "," line_count ")"

line_count ::=
   integer

Compiler flags

compiler_flag ::=
   flag "(" flag_value ")"