Prolog的数据结构( 二 )


下图是对上一个例子扣问的成果 , 注重不雅察匹配模式 。 此中“_”为空变量 , 暗示不关心该位置上的元素 。
2SWI-Prolog的递归
2Prolog的根基概念和语律例则

Prolog的数据结构



表处置1确定一个对象是否为某个表的当作员 。 例如 , 我们有一个表List , 内容是一些编程说话的名字 。 查找法式如下:
find(List,[List|_]).
find(List,[_|T]) :- find(List,T).
2SWI-Prolog的递归

Prolog的数据结构



2这是它的运行成果 。 Prolog对谜底搜刮的过程如下:
进入常识库 , 试图与法则一匹配 , 因为方针与表头分歧 , 故掉败;
继续搜刮 , 试图与法则二匹配 , 方针和表从头至尾作为参数 , 从头回到法则一 , 直到当作功 。

Prolog的数据结构



3两个表的追加 。 有时需要把两个表归并当作一路形当作新表 , 这个过程叫做并置或追加 。 下面这段代码可实现表的追加 , concatenate(A,B,C).后就可以将表B追加到表A后形当作表C 。
2SWI-Prolog的递归

Prolog的数据结构



4对于它的工作机制 , 不妨先从特别到一般的法则来领会 。
?编写一个法则concatenate(List1, List2, List3). , 它可以将一个空列表与List1毗连在一路 。 这一点很轻易 , concatenate([ ], List, List).就可以做到 , 当执行addto时 , List3会和要追加的List2不异;
?添加一个法则 , 它可以将List1中的一个元素与List2毗连在一路:concatenate([Head|[]], List, [Head|List]).;
?添加一个法则 , 它可以将List1中的两个元素或三个元素与List2毗连在一路;
?泛化这些法则 , 转化递归形式 , 最终形当作上图中的代码 。

Prolog的数据结构



5表的反序 。 将表中元素的次序倒置过来也是常用的一种处置过程 。 这个法式需要连系上一个例子中的追加列表的法式 。 其Prolog法式如下:
re([],[]).re([H|T],L) :-    re(T,M),    concatenate(M,[H],L).

Prolog的数据结构



6以上法则是基于如许的思惟 , 即可以经由过程把一个表头追加到该表的表从头至尾的反序表上 , 达到反序的目标 。 谓词reverse的第一个变元缩减到空表时 , 知足遏制前提 , 遏制前提还可以表述为空表的反序仍为空表自己 。 下图是法式的运行成果 。 在导入法式时要注重文件的挨次 。

Prolog的数据结构



7表处置的一般形式 。 任何用于完当作表处置的法则都是自身的递归 。 表处置法则具有以下一般形式:
manipulate(具有表头H和表从头至尾T的表) :-
    完当作表头H的处置,

猜你喜欢