问题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行:嗯现在甚至都不值得理解。请在下面发表评论,以帮助我了解该计划的当前逻辑。最诚挚的问候。
答案 0 :(得分:2)
如果您对第一顺序逻辑有点熟悉,您可能会发现将,
替换为逻辑嵌入并将max_num([X|Y],X)
替换为max_num(Y,Z)
会很有帮助。然后程序的第二行看起来像:
X >= Z
←max_num(Y,Z)
∧X >= Z
请注意,暗示箭头向左移动,朝向规则的头部。您可以翻转它,以更熟悉的方向查看暗示箭头点:
max_num([X|Y],X)
∧Z
→Y
该行显示:如果(X >= Z
是列表X
的最大值和 X
)则< / strong> Y
是列表的最大值,max_num([X|Y],A)
作为第一个元素(head),max_num(Y,A)
作为列表的其余部分(尾部)。
第三行也是如此:
A > X
←A
∧Y
如果(A > X
是列表A
的最大值和 X
)那么 { {1}}是以Y
为首,max_num([X],X) :- true.
为尾的列表的最大值。
我不确定你对第一条规则的模板是什么意思。该程序的第一行是事实。这是一种在prolog中说的方式:这始终是真的。你也可以写它:
X
声明性地说:列表中只包含一个元素[X]
的最大数字就是那个元素。
程序上你需要这个事实才能让程序终止(至少对于固定长度的列表)。试想一下:
如果第一个参数是:
[X] = [X|[]]
:第一条规则匹配并成功。第二个和第三个规则也匹配,因为[X|Y]
但它们的递归目标失败,因为max_num / 2没有空列表与第一个参数匹配的规则。
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 >= Z
(X
,头部,大于或等于Z
。)
请注意,您所指的“垂直线”会分隔列表的 head 和 tail 。如果你做一个基本的Prolog教程或阅读一些介绍Prolog材料,这将被解释。 head 是第一个元素, tail 是构成列表其余部分的列表。因此,列表[H|T]
具有第一个元素H
,列表的其余部分为列表T
。
如果您理解这一点,那么阅读第3行应该很简单。