这个Prolog示例如何工作?

时间:2016-04-05 23:54:00

标签: prolog

问题Reads,“编写一个Prolog程序,找到最大的数字列表。”

我利用互联网的力量帮助找到有效的解决方案但是,我希望对程序本身有所了解。

max_num([X],X).
max_num([X|Y],X):- max_num(Y,Z), X >= Z.
max_num([X|Y],A):- max_num(Y,A), A > X.

线路1:

max_num([X],X).

我知道Line1正在定义问题的基本模板。 [X]定义列表,另一个X表示该列表中的最大值。

线路2:

max_num([X|Y],X):- max_num(Y,Z), X >= Z.

这是我忘记事物的地方。我理解第一部分,“max_num([X | Y],X)”,它将列表分成两部分,“前半部分”和“后半部分”由垂直线分隔。而X只是最大数?我不确定这一点。

第3行:嗯现在甚至都不值得理解。请在下面发表评论,以帮助我了解该计划的当前逻辑。

最诚挚的问候。

2 个答案:

答案 0 :(得分:2)

如果您对第一顺序逻辑有点熟悉,您可能会发现将,替换为逻辑嵌入并将max_num([X|Y],X)替换为max_num(Y,Z)会很有帮助。然后程序的第二行看起来像:

X >= Zmax_num(Y,Z)X >= Z

请注意,暗示箭头向左移动,朝向规则的头部。您可以翻转它,以更熟悉的方向查看暗示箭头点:

max_num([X|Y],X)ZY

该行显示:如果X >= Z是列表X的最大值 X则< / strong> Y是列表的最大值,max_num([X|Y],A)作为第一个元素(head),max_num(Y,A)作为列表的其余部分(尾部)。

第三行也是如此:

A > XAY

如果A > X是列表A的最大值 X那么 { {1}}是以Y为首,max_num([X],X) :- true. 为尾的列表的最大值。

我不确定你对第一条规则的模板是什么意思。该程序的第一行是事实。这是一种在prolog中说的方式:这始终是真的。你也可以写它:

X

声明性地说:列表中只包含一个元素[X]的最大数字就是那个元素。

程序上你需要这个事实才能让程序终止(至少对于固定长度的列表)。试想一下:

如果第一个参数是:

  • [X] = [X|[]]:第一条规则匹配并成功。第二个和第三个规则也匹配,因为[X|Y]但它们的递归目标失败,因为max_num / 2没有空列表与第一个参数匹配的规则。

  • {li>

    Y []不是Y:第一条规则不匹配。但是其他两个做了,他们会递归,因为{{1}}不是空列表,因此匹配max_num / 2的第一个参数。

答案 1 :(得分:1)

:-运算符用于根据其他查询定义谓词子句规则。您有一个谓词max_num/2(有两个参数),包含三个谓词子句规则,其中第一个这是一个非常简单的规则:max_num([X], X).您已经注意到了这个规则:

  

X是列表[X]中的最大数字。

通常,您可以将:-读作“if”作为规则:

max_num([X|Y],X) :- max_num(Y,Z), X >= Z.

会读到:

  

X是列表[X|Y]的最大数量(列表为X的列表   和Y} 如果 Z是最大值   尾部的数量Y X >= ZX,头部,大于或等于Z。)

请注意,您所指的“垂直线”会分隔列表的 head tail 。如果你做一个基本的Prolog教程或阅读一些介绍Prolog材料,这将被解释。 head 是第一个元素, tail 是构成列表其余部分的列表。因此,列表[H|T]具有第一个元素H,列表的其余部分为列表T

如果您理解这一点,那么阅读第3行应该很简单。