prolog是一门比较独特的语言,有人将之归纳为“声明式”。特点是,开发者通过构建基于数理逻辑的“知识库”,而后由prolog根据知识库主动求解,而无需开发者描述算法。因此如何构建知识库,或者说,如何使用数理逻辑的方式描述已知和问题,是学习prolog的重点。
在prolog里,小写字母开头的字符序列为一个“原子(atom)”,大写字母开头的字符序列为一个“变量”。原子类似ruby中的symbol。“_”可以匹配任意变量,可以视作一个占位符。
知识库需要写在文件里预先编译,写好后在prolog交互控制台里执行['filename.pl'].来编译知识库。
交互控制台似乎只能查询。另外不同的prolog中有各自不同的方言。
注意:处理未被定义的规则时一定要注意。比如:
在知识库里没有定义is_human(neko).这条规则时,使用\+(is_human(neko)).可以正确返回true,但注意:将neko换为X之类的大写变量时,prolog无法返回所有满足条件的记录,只会简单地返回一个no。因此,无法利用这种规则来建立逻辑推导,只能显式定义is_not_human(neko). ,不知是不是我对prolog的理解不到位。
[Head|Tail] = 一个列表时,Head会匹配头,Tail会匹配第二个及以后的元素所构成的集合。但无法匹配空列表,即:Head必须有元素才能匹配。
prolog中与输入有关的谓词(参考这个GitHub页面):
geto(X) 如 X与输入流中的下一个字符匹配,则目标成功。
get(X) 如 X与输入流中的下一个打印字符匹配,则目标成功
skip(X) 读入并跳过当前输入流中的字符,直到找到一个可与X匹配的字符
read(X) 读入当前输入流的下一个项,并使之与X匹配
put(X) 把整数X输出到当前输出流(X必须例化)
nl 对当前输出流输出控制符"回车换行"
tab(X) 输出X个空格符到当前输出流(X必须例化)
write(X) 把项X输出到当前输出流
display(X) 与write(X)相似,只是它忽略运算符说明,以结构形式输出项
op(X,Y,Z) 说明名为Z的运算符,其优先级为X,结合规则为Y
待补充更多语法……
待补充更多语法……