首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Prolog:列表中的平方数

Prolog:列表中的平方数
EN

Stack Overflow用户
提问于 2013-11-02 19:32:06
回答 1查看 9.8K关注 0票数 2

我在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

我已经尝试过了,

代码语言:javascript
代码运行次数:0
运行
复制
square([],X).
square([A|B],X):-number(A), A is A*A, square(B,X).

X将包含平方值。基大小写是当收到空列表时。我检查头( A )是否是一个数字,然后我先将数字平方,然后将A改为A*A,然后继续调用其余B部分的平方函数。

请告诉我哪里做错了。

编辑:正确的答案如下。由aBathologist.请阅读他的评论以获得详细的解释。

代码语言:javascript
代码运行次数:0
运行
复制
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).

代码语言:javascript
代码运行次数:0
运行
复制
squared_members([], []).
squared_members([L|Ls], [M|Ms]) :-
  ( number(L)
  ->  M is L * L, squared_members(Ls, Ms)  
  ;   M = L, squared_members(Ls, Ms)
  ).
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-03 00:34:33

我们定义了一个谓词,它描述了一个列表A和另一个列表B: B之间的关系,B:B应该有所有与A相同的元素,但A中的任何数字都应该在B中平方。

你做错了什么:

  • 你的基础条件,square([],X),说当A是空的,那么B就是任何东西(例如,甚至像square([], 15)这样的东西也是真的)。但这并不能表达我们所追求的意义,因为第二个参数应该是一个与第一个参数相同的成员数的列表。也就是说,当第一个列表是空的,那么第二个列表应该是空的。
  • 递归规则也会出现同样的问题,因为在每次迭代时,都会传递一个未定变量,而且对于第一个列表和第二个列表之间的关系从来没有说过什么。
  • 只有当第一个要素是数字时,这个规则才会成功。在第一个元素为a的情况下(如您的示例中),number(a)将为false。由于谓词没有附加规则,除非第一个列表中的每个成员都是一个数字,否则它将是假的。
  • Prolog中的变量必须在其出现的上下文中始终具有相同的一致值。它们的作用就像算术公式中的变量。公式a+ but =a对于a和b的任何值都是真的,但*只有当a和b各分配一个时,整个方程的一致值才是成立的。在表单<variable> is <expression>的Prolog语句中也是如此。你写的是a=a*a,但情况并非如此。

*你的定义大概是这样的:如果A是空列表,而B是数字的第一个元素,则列表B是列表A的平方版本,该数字等于它本身的平方,B是A的其余部分的平方版本。

这里有一个可能的解决方案:

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
squared_members([], []).
squared_members([L|Ls], [M|Ms]) :-
  ( number(L)
  ->  M is L * L, squared_members(Ls, Ms)  
  ;   M = L, squared_members(Ls, Ms)
  ).
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19745958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档