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

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

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

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

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

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

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

7表处置的一般形式 。 任何用于完当作表处置的法则都是自身的递归 。 表处置法则具有以下一般形式:
manipulate(具有表头H和表从头至尾T的表) :-
完当作表头H的处置,
猜你喜欢
- Word如何为每一页添加不同的页眉
- 星期一到星期日的英文 星期一到星期日的英文是什么
- 移动网上营业厅的电子发票如何下载
- 英语世界动物日手抄报 世界动物日的手抄报怎么画
- printf语句控制输出数值的宽度和小数点后位数
- 叶落归根的意思 叶落归根的出处
- WIN10自带计算器如何计算a的多少次方等于b
- autocad P3D如何设置修改一条直线的终点坐标
- 不惜歌者苦但伤知音惜的意思 不惜歌者苦但伤知音稀什么意思
- 人故有一死或重于泰山或轻于鸿毛的固是什么意思 人故有一死或重于泰山或轻于鸿毛的意思
