我在prolog的列表中有方号吗?
列表可以包含数字、原子和列表。
例如:[a,b,2,3,4,[3],[c,d,9]]
,答案应该是[a,b,4,9,16,[3],[c,d,9]]
。正如我们在答案中所看到的,它应该是列表中的值的浅平方。
2->4
3->9
4->16
我已经尝试过了,
square([],X).
square([A|B],X):-number(A), A is A*A, square(B,X).
X将包含平方值。基大小写是当收到空列表时。我检查头( A )是否是一个数字,然后我先将数字平方,然后将A改为A*A,然后继续调用其余B部分的平方函数。
请告诉我哪里做错了。
编辑:正确的答案如下。由aBathologist.请阅读他的评论以获得详细的解释。
squared_members([], []).
squared_members([L|Ls], [SqrdL|SqrdLs]) :-
number(L),
SqrdL is L * L,
squared_members(Ls, SqrdLs).
squared_members([L|Ls], [L|SqrdLs]) :-
\+number(L),
squared_members(Ls, SqrdLs).
和
squared_members([], []).
squared_members([L|Ls], [M|Ms]) :-
( number(L)
-> M is L * L, squared_members(Ls, Ms)
; M = L, squared_members(Ls, Ms)
).
发布于 2013-11-02 16:34:33
我们定义了一个谓词,它描述了一个列表A和另一个列表B: B之间的关系,B:B应该有所有与A相同的元素,但A中的任何数字都应该在B中平方。
你做错了什么:
square([],X)
,说当A是空的,那么B就是任何东西(例如,甚至像square([], 15)
这样的东西也是真的)。但这并不能表达我们所追求的意义,因为第二个参数应该是一个与第一个参数相同的成员数的列表。也就是说,当第一个列表是空的,那么第二个列表应该是空的。a
的情况下(如您的示例中),number(a)
将为false。由于谓词没有附加规则,除非第一个列表中的每个成员都是一个数字,否则它将是假的。<variable> is <expression>
的Prolog语句中也是如此。你写的是a=a*a,但情况并非如此。*你的定义大概是这样的:如果A是空列表,而B是数字的第一个元素,则列表B是列表A的平方版本,该数字等于它本身的平方,B是A的其余部分的平方版本。
这里有一个可能的解决方案:
squared_members([], []).
squared_members([L|Ls], [SqrdL|SqrdLs]) :-
number(L),
SqrdL is L * L,
squared_members(Ls, SqrdLs).
squared_members([L|Ls], [L|SqrdLs]) :-
\+number(L),
squared_members(Ls, SqrdLs).
请注意,这个定义能够在两个列表之间建立有意义的关系,方法是让它们共享变量,或者包含变量之间的关系链相关的元素(即,SqrdL由于L*L而与L相关)。这个定义比您的定义多了一个子句,这使它能够考虑到一个列表的成员而不是数字:这些成员被添加到第二个列表中,没有改变。
另一种定义,即使用If
squared_members([], []).
squared_members([L|Ls], [M|Ms]) :-
( number(L)
-> M is L * L, squared_members(Ls, Ms)
; M = L, squared_members(Ls, Ms)
).
https://stackoverflow.com/questions/19745958
复制