Alchemy用户手册:语法
4. 语法
马尔可夫逻辑网络是由一些带有权值的一阶谓词规则组成的,所以Alchemy输入文件的核心语法就是有关这些一届谓词逻辑的。Alchemy提供了一些机制扩展语法和使用内部执行的谓词和函数。下面两节分别介绍这两部分内容。
4.1 一阶谓词逻辑
你可以在.mln文件中表示任意的一阶谓词逻辑规则。逻辑连接词的语法是:
! (非), ^ (与), v (或), => (蕴涵), <=> (当且仅当),FORALL/forall/Forall (任意量词),和EXIST/exist/Exist (存在量词)。各个操作的优先级为:not>and>or>蕴涵>当且仅当>任意量词=存在量词,相同的优先级按照从左到右排列。可以使用括号处理不同优先级。最外层的任意量词可以省略掉。量词可以被作用于多个变量(比如forall x,y)。等号符号可以被认为是相等谓词(比如:equals(x,y))的简写。
4.2 MLN语法
1. 三个操作符:*,+和!。
1) 谓词前面出现*表示真假都需要考虑,比如*student(x) ^ *professor(x)应该扩展为下面四个规则:
* student(x) ^ professor(x)
* !student(x) ^ professor(x)
* student(x) ^ !professor(x)
* !student(x) ^ !professor(x)
这个语法允许你简洁地表达Markov逻辑网络中的逻辑规则。
2) +作用在变量前面表示求出该变量每个常量的相应表达式,当变量前面含有+表示需要每个包含常量的规则学习权重,比如:hasPosition(x,+y)应该求解y变量所有的常量:
* hasPosition(x,Faculty)
* hasPosition(y,Faculty_adjunct)
* hasPosition(y,Faculty_emeritus)
如果多个变量前面有+,则为每个常量组合学习权重。当指定多个数据库的时候,仅仅从+生产的常量对权重所有贡献。
3) !作用在变量后面,表示互斥作用,即值存在一个该类型的值满足情况,比如hasPosition(x, y!)表示每个x只有一个确定的y与之对应。此约束表示执行推理和学习时强制执行:它能够保证每个规则只有一个原子是真实的。注意,变量后面的!与谓词前面的!不同。
2. 注释同C++中一样,使用//和/* */。
3. 保留特殊字符有@ 和 $。因为内部处理函数的原因,变量名不要以funcVar开头,谓词名不要以isReturnValueOf开头。
4. 一个规则前面在前面加上数值表示该规则的权重。表示该规则非常之确定的硬规则是在其后面加上.结束。[注:英文句号]但是,不可同时有数值和.号。规则中,在=>, <=>, ^ 和 v后面可以接空行[注:表示空行下面的语句还属于该规则]。
5. 变量以小写字母开头,常量以大些字符开头(可以是字符串,但是要加上“”包围起来,比如Alice 和 ``A Course in Logic''都是合法的常量)。合法的表示符是字母序列,-,_和'[注:'不可以是首字母]。
6. alchemy会对含有若干子句的表达式进行分拆
比如:(注意,后两子句绑定在一起,同真或同假),拆分:
2 P(x) ^ Q(x) ^ (R(x) v S(x))
为:
-1 !P(x) v !Q(x) 和
1 R(x) v S(x).
这是Alchemy的默认设置,也可以用[]中括号括起子句让它不要去用析取范式分拆,比如上面的句子让想让它不要被分拆就要写为:
2 P(x) ^ [ Q(x) ^ (R(x) v S(x)) ]
就只拆分为:
1 P(x)
0.5 Q(x)和
0.5 R(x) v S(x).
7. 类型(变量)和常量定义如下:
<typename> = { <constant1>, <constant2>, ... }
e.g., person = { Alice, Bob }
e.g.,ageOfStudent = { 18, ..., 22 }
每个变量必须至少含有一个常量,{}里面可以包含空行。
8. 其他方面
可以使用#include引入其他文件中的定义,#include "university.mln"
当执行的时候遇到语法和语义错误的时候会给出错误信息,每个错误信息包括错误句子的行数和列数,行数从1开始,列数从0开始。错误可能不是完全在指定的列,但是在它附近,一个错误也可能是以前的一个错误结果(很像编译器的错误消息)。