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

Prolog:列表中的平方数
EN

Stack Overflow用户
提问于 2013-11-02 11: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
运行
AI代码解释
复制
square([],X).
square([A|B],X):-number(A), A is A*A, square(B,X).

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

请告诉我哪里做错了。

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

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

复制
相关文章
[每日一题]破解平方数
这次的题目是九月月赛的第二题,相信大家肯定是没问题的 题目描述 给出m个数b1, b2,..., bm,每个数的素数因子都在前t个素数之内,任务是寻找这m个数的非空子集的个数x,使得每个子集的乘积都是一个完全平方数。例如t=3,则前3个素数为2, 3, 5。m=4,这4个数为9, 20, 500, 3, 每个数的素因子都是在前3个素数内,则有x=3个非空子集合{9}, {20, 500}, {9, 20, 500},满足每个集合内的数的乘积是一个完全平方数,输出这样的集合的个数。 输入 每组
编程范 源代码公司
2018/04/18
1.3K0
prolog实例_prolog实例
Jetbrains全家桶1年46,售后保障稳定 现在打开编辑器GNU-Prolog,打开文件可以直接询问机器:
全栈程序员站长
2022/11/16
1.3K0
Python_列表中的偶数变成他的平方
#编写程序将列表中的偶数变成他的平方 def word_len(s): # s = [i ** 2 for i in s if i % 2 == 0] L = [] for i in s: if(i % 2 == 0): L.append(i** 2) else: L.append(i) return L def main(): s = [2, 6, 1, 3, 9, 4, 22]
瑞新
2020/07/07
2K0
633. 平方数之和
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c 。 示例 1: 输入:c = 5 输出:true 解释:1 * 1 + 2 * 2 = 5 示例 2: 输入:c = 3 输出:false class Solution { public boolean judgeSquareSum(int c) { /** 双指针问题 可以让left=1 right=根号c 如果left^2+right^2=c return true
CaesarChang张旭
2021/06/10
5050
例2 判断平方数
#示例: 输入num=16, 输出True, sqrt(16)=4; 输入num=15, 输出False, sqrt(15)=3.87 class Solution: def isPerfectSquare(self, num): l=0 r=num while (r-l > 1): mid=(l + r) / 2 if (mid * mid <= num): l = m
hankleo
2020/09/17
6640
279. 完全平方数
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
张伦聪zhangluncong
2022/10/26
4480
回文平方数 Palindromic Squares
P1206 [USACO1.2]回文平方数 Palindromic Squares
glm233
2020/09/28
8140
279. 完全平方数
一. 题目 二. 思路 动态规划 三. 代码: class Solution { /** * dp[i]:表示完全平方数和为i的 最小个数 * 初始状态dp[i]均取最大值i,即 1+1+...+1,i个1; dp[0] = 0 * dp[i] = min(dp[i], dp[i-j*j]+1),其中, j是平方数, j=1~k,其中k*k要保证 <= i * 完全平方数和为 i - j * j 的最小个数 +
名字是乱打的
2021/12/24
4660
279. 完全平方数
LeetCode79|平方数之和
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c 。
码农王同学
2020/10/14
5670
LeetCode-279-完全平方数
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
benym
2023/02/14
2970
LeetCode-279-完全平方数
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
benym
2022/07/14
2540
LeetCode 367. 有效的完全平方数
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
IT人一直在路上
2019/09/18
3680
LeetCode 633.平方数之和
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c
村雨遥
2020/03/24
3880
力扣279——完全平方数
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
健程之道
2020/02/12
4870
USACO Training Section 1.2 [USACO1.2]回文平方数
题目描述 回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。
风骨散人Chiam
2020/10/28
6110
LeetCode 279. 完全平方数(DP)
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
Michael阿明
2020/07/13
6900
LeetCode 279. 完全平方数(DP)
Python中求数字的平方根和平方的几种
方法一: 使用内置模块 >>> import math >>> math.pow(12, 2) # 求平方 144.0 >>> math.sqrt(144) # 求平方根 12.0 >>> 方法二: 使用表达式 >>> 12 ** 2 # 求平方 144 >>> 144 ** 0.5 # 求平方根 12.0 >>> 方法三: 使用内置函数 >>> pow(12, 2) # 求平方 144 >>> pow(144, .
py3study
2020/01/09
2.1K0
Python中如何求列表list的平均数[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127125.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/25
2.2K0
LC 633. 平方数之和(双指针)
题目 思路 双指针解法left从0开始,right从sqrt(c)开始。 然后判断收缩指针。 class Solution { public: bool judgeSquareSum(int c) { long long left = 0, right = sqrt(c); while (left <= right) { long long a = left * left, b = right * right; if
SakuraTears
2022/01/13
2590
LC 633. 平方数之和(双指针)
leetcode 279. 完全平方数----完全背包的套路
不失一般性的分析 dp[i][j] ,对于第 i个数字(假设数值为 t),我们有如下选择:
大忽悠爱学习
2021/11/15
2370

相似问题

Prolog列表平方,修改列表中的元素

21

求自然数平方的Prolog程序

10

获取无平方数的列表。

82

在Prolog中创建给定列表的平方根表

12

列表中的平方数,然后将它们相加

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文