codecamp

Logica 语法

这是 Logica 程序的半正式 BNF。


// 程序是由分号分隔的条目序列。
program ::= program_entry (';' program_entry)* [;]

// 每个条目都是导入、规则或函子应用程序。
program_entry ::= import | rule | functor_application

// 导入示例--将path.to.file.Predicate作为另一个谓词导入
import ::=
  'import' dot_separated_path '.' logica_predicate ['as' logica_predicate]
dot_separated_path ::= [^<newline>]+

// 程序定义的谓词是以
// 大写字母,如果是祈使谓词,则为“@”。
logica_predicate ::= ordinary_logica_predicate | imperative_predicate
// 普通谓词是Logica的主要内容, 例如 -- Grandparentordinary_logica_predicate ::= [A-Z_][0-9a-zA-Z_]*
// 命令谓词用于注释,例如 -- @Groundimperative_predicate ::= '@' [0-9a-zA-Z_]*

// 还可以使用数据库表作为谓词。
predicate ::= logica_predicate | '`'[^`]+'`' | [A-Za-z_0-9.]+

// 变量必须是小写数字。
variable ::= [a-z0-9_]

// 规则是一个头和一个可选的主体。
rule ::= rule_head [ ':-' rule_body ]

// 规则的主体是一个命题。
rule_body ::= proposition

// 规则头是一个带有可选赋值和
// 可选的“独特”表示法。
rule_head ::= head_call [assignment] ['distinct']

// 简单赋值的例子是 -- = 2 * x// 聚合赋值的例子是 -- List= 2 * x.assignment ::= simple_assignment | aggregating_assignment
simple_assignment ::= '=' expression
aggregating_operator ::= ('+' | logica_predicate) '='
aggregating_assignment ::= aggregating_operator expression

// 谓词名称和开头之间不允许有空格
// 括号。
call ::= predicate '(' record_internal ')'
head_call ::= logica_predicate '(' aggregating_record_internal ')'

// 内部记录示例 -- a: 5, b: 2 * xrecord_field_value ::= field ':' expression
record_internal ::= 
  [record_field_value (',' record_field_value)* [',' '..' variable]] |
  ('..' variable)

// aggregating_field_value 实例 -- x? += 5
aggregating_field_value ::= field '?' aggregating_assignment
aggregating_record_internal  ::=
  [record_field_value | aggregating_field_value]
  [',' (record_field_value | aggregating_field_value)]*

// 表达式是谓词调用、操作、组合,
// 列出包含、隐含或对象描述。
expression ::=
  call |
  unary_operator_call |
  binary_operator_call |
  combine |
  inclusion |
  implication |
  string_literal |
  number_literal |
  boolean_literal |
  null_literal |
  list |
  record |
  ('(' expression ')')

operator ::= '+'|'-'|'/'|'>'|'<'|'<='|'>='|'=='|'->'|'&&'|'||'

unary_operator ::= '!'|'-'

unary_operator_call ::= unary_operator expression
binary_operator_call ::= expression operator expression

// 包含示例 -- x in [1,2,3,4]inclusion ::= expression 'in' expression

// 隐含的例子 -- if a == b then 7 else 9
implication ::=
  '(' 'if' expression then expression
  ['else if' expression 'then' expression]*
  'else' expression ')'

// 如果组合有一个body,那么它必须被封闭在括号中。
combine ::= 'combine' aggregating_assignment [':-' rule_body]

// 具体对象规范。
string_literal ::= '"'[^"<newline>]'"'
number_literal ::= [0-9]+ [ '.'[0-9]+ ]
boolean_literal ::= 'true'|'false'
null_literal ::= 'null'
list ::= '[' [expression [','expression]*] ']'
record ::= '{' record_internal '}'

// 命题是连词,析取,否定,
// 谓词调用、操作或列表包含。
proposition ::=
  conjunction |
  disjunction |
  negation |
  call |
  binary_operator_call |
  unary_operator_call |
  assign_combination |
  inclusion |
  ('(' proposition ')')

conjunction ::= proposition (',' proposition)*
disjunction ::= proposition ('|' proposition)*
negation ::= '~' proposition

// 赋值组合示例 -- l List= (2 * x :- x in [1,2,3])assign_combination ::= variable
  aggregating_assignment |
  (aggregating_operator '(' expression ':-' proposition ')')

// 函子应用实例 -- F := G(A: B)functor_application ::= logica_predicate ':=' logica_predicate '(' functor_record_internal ')'
functor_record_internal ::=
  [logica_predicate ':' logica_predicate]
  (',' logica_predicate ':' logica_predicate )*


注释

  • ​#​——从井号开始到行末的内容将被注释,也可称为单行注释。
  • /* /*​——这个组合​/*​ 与​/*​之间的内容将被注释,也可称为多行注释。


温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }