如何验证坐标是否在列表中

2023-12-10

我正在生成随机坐标并添加到我的列表中,但首先我需要验证该坐标是否已经存在。我正在尝试使用member但是当我调试时我发现它不起作用:

我的代码基本上是这样的:

% L is a list and Q is a count that define the number of coordinate
% X and Y are the coordinate members
% check if the coordniate already exists
% if exists, R is 0 and if not, R is 1
createCoordinates(L,Q) :-
    random(1,10,X),
    random(1,10,Y),
    convertNumber(X,Z),
    checkCoordinate([Z,Y],L,R),
    (R is 0 -> print('member'), createCoordinates(L,Q); print('not member'),createCoordinates(L,Q-1).

checkCoordinate(C,L,R) :-
    (member(C,L) -> R is 0; R is 1).

% transforms the number N in a letter L
convertNumber(N,L) :-
    N is 1, L = 'A';
    N is 2, L = 'B';
    ...
    N is 10, L = 'J'.

%call createCoordinates
createCoordinates(L,20).

当我调试时,这是输出:

debugging

在这张图中,我处于第一次迭代中,L 为空,因此 R 应该为 1,但始终为 0,坐标始终是列表的一部分。 我的印象是member子句在我的列表中添加坐标,但没有意义


首先,我建议将您的问题分解为更小的部分。您应该有一个制作随机坐标的过程:

random_coordinate([X,Y]) :- 
    random(1, 10, XN), convertNumber(XN, X), 
    random(1, 10, Y).

其次,你的checkCoordinate/3正在将 Prolog 的成功/失败转换为整数,这对 Prolog 来说只是忙碌的工作,并没有真正改善你的生活。memberchk/2完全足以完成您的任务(member/2也可以工作,但比必要的更强大)。这里真正的问题不是这个member/2不起作用,而是您试图在退出时建立此列表参数,但您需要它在进入时存在才能检查它。

我们通常通过添加第三个参数并在过程中将值添加到列表中来解决 Prolog 中的此类问题。然后,基本情况将该列表与出站列表等同,并且我们使用较低数量的过程来保护整个列表。换句话说,我们这样做:

random_coordinates(N, Coordinates) :- random_coordinates(N, [], Coordinates).

random_coordinates(0, Result, Result).
random_coordinates(N, CoordinatesSoFar, FinalResult) :- ...

现在我们有两件事,memberchk/2应该按照我们需要的方式工作:

random_coordinates(N, CoordinatesSoFar, FinalResult) :- 
   N > 0, succ(N0, N),   % count down, will need for recursive call
   random_coordinate(Coord),
   (memberchk(Coord, CoordinatesSoFar) -> 
       random_coordinates(N, CoordinatesSoFar, FinalResult)
   ;
       random_coordinates(N0, [Coord|CoordinatesSoFar], FinalResult)
   ).

这似乎符合我们的要求:

?- random_coordinates(10, L), write(L), nl.
[[G,7],[G,3],[H,9],[H,8],[A,4],[G,1],[I,9],[H,6],[E,5],[G,8]]

?- random_coordinates(10, L), write(L), nl.
[[F,1],[I,8],[H,4],[I,1],[D,3],[I,6],[E,9],[D,1],[C,5],[F,8]]

最后,我注意到您继续使用以下语法:N is 1, ...。我警告你,这对我来说看起来像是一个错误,因为这和N = 1,你的谓词可能会有点令人厌烦地这样表述:

convertNumber(1, 'A').
convertNumber(2, 'B').
...

我的倾向是通过计算来完成char_code/2但这种结构实际上可能更好。

另一个提示您做错的事情是参数L to createCoordinates/2在所有情况下都会被传递,并且在任何情况下都不会被检查。在 Prolog 中,我们经常会看到看似毫无意义地传递的变量,但它们通常会改变位置或多次使用,如random_coordinates(0, Result, Result);虽然那里似乎什么也没发生,但实际发生的是管道:构建的参数变成了结果值。那里的变量没有发生任何有趣的事情,但正在对其进行探索。但是代码中的 L 根本没有发生任何事情,除了据说正在检查新坐标之外。但你实际上从来没有向它附加任何东西,所以没有理由期望任何东西都会在 L 中结束。

Edit请注意,@lambda.xy.x 通过在子句头部添加新坐标并仅在主体中的递归调用之后检查列表来解决其答案中的问题,从而消除了对第二个列表参数的需要。

Edit 2另请查看 @lambda.xy.x 的其他解决方案,因为当 N 接近 100 时,它具有更好的时间复杂度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何验证坐标是否在列表中 的相关文章

  • 如何实现 not_all_equal/1 谓词

    如何实施not all equal 1谓词 如果给定列表包含至少 2 个不同的元素 则该谓词成功 否则失败 这是我的尝试 不是很纯粹的尝试 not all equal L member H1 L member H2 L H1 H2 gt t
  • 如何在 Prolog 中为变量(如字符串)分配多个值?

    今天早些时候 我寻求帮助以在序言中构建数据库以及如何通过参数搜索 有人提出了这个 您还可以向每个处理器添加术语列表 例如 processor pentium g4400 brand intel family pentium series g
  • Prolog - 从列表中删除具有相同第一个值的对

    我有这样的对象列表 list obj x y obj x z obj a b obj b c 我想删除那些共享相同第一个值的元素 这样我就可以使用修改后的列表 在这种情况下 最终列表将如下所示 list obj a b obj b c 有人
  • 如何从序言中的列表中删除列表?

    我想在序言中实现以下问题 Given L1 1 2 3 4 and L2 2 3 4 调用名为remove list L1 L2 L 的函数将从L1中删除L2 所以L将是 1 但是 如果第二个列表的元素与 L1 中的元素顺序不同 或者更准确
  • Prolog 同构图

    这里尝试解决同构图问题 作业信息 判断2个无向图是否同构 没有孤立的顶点 顶点数小于30 图的边作为谓词给出 即 e 1 2 f 1 2 我正在尝试使用以下方法 对于每对边 即图 1 和图 2 中的每条边 Try to bind the v
  • 井字游戏的极小极大

    我正在尝试用简单的极小极大算法来解决井字游戏 简单 但应该涵盖很多语言 到目前为止我所拥有的 该板表示为 9 个 未绑定 变量的数组 这些变量可以设置为x or o 获胜条件基本上是 win Player X1 X2 X3 X1 Playe
  • 在 Prolog、尾递归中计算斐波那契数列

    我想在 Prolog 中以递归尾部模式计算斐波那契数列 fibonacci 0 0 fibonacci 1 1 fibonacci N Result fibonacci N 1 0 fibonacci N Result Count Coun
  • 在 Prolog 中动态拆分列表

    我从序言开始几周 但我看到了更深入的操作列表的递归谓词的构造 我的问题是 是否可以构建一个谓词 将给定列表拆分为给定数量的其他列表 比如我想象的 split H T NumberLists Lists 递归实现 split 1 2 3 4
  • 列表中的连续元素

    我正在阻止一个谓词来编码Prolog 我需要对两个谓词进行编码 如果我打电话 u a b c d e f X 它会给X a b X b c X c d 如果我打电话 v a b c d e f X 它会给X a b X c d X e f
  • 控制 Prolog 变量值选择

    灵感来自之前的一个问题 https stackoverflow com questions 41595786 using operator to save variables in a list我尝试实现一些可以枚举布尔表达式可能性的东西
  • SWI Prolog 使用的检查优化会发生什么情况?

    去引用SICStus Prolog 手册 https sicstus sics se sicstus docs 3 12 9 html sicstus Occur html 逻辑编程背后的通常数学理论禁止 创建循环项 规定发生检查应该是 每
  • 如何为有效号码指定 DCG?

    我正在尝试为有效数字指定 DCG 如下所示 value Number gt valid number Number 基本上检查指定的值是否是数字 它也可能是变量 因此有必要检查 我不知道如何构建这个valid number不过 DCG 谓词
  • 如何在 Prolog 中解决这个算术表达式难题?

    我有一个编程问题 https blog svpino com 2015 05 08 solution to problem 5 and some other thoughts about this type of questions htt
  • 变量的多个值介于 0 和数字序言之间

    所以我一直在尝试自学序言 我认为我进展顺利 然而 我有点坚持我正在尝试的这一种方法 toN N A A 等于 0 到 N 1 之间的整数值 按升序生成 所以 toN 5 A 将是 A 0 A 1 A 2 A 3 A 4 我对序言还很陌生 所
  • 这个版本的trace有什么问题?

    我有这个跟踪元解释器 它是为 swi prolog 编写的 trace Goal trace Goal 0 trace true Depth true trace fail Depth fail trace A gt B Depth A g
  • Prolog 列表列表获取所有元素

    我有一个列表列表 decide 1 2 3 2 3 6 4 K 我想按 返回所有可能的解决方案 规则是首先返回其列表大小为 1 的值 然后我想返回其大小大于1的值 size 0 size Xs L size Xs N L is N 1 he
  • json 获取 prolog 谓词

    我试图在序言中创建这个谓词 谓词json get 3可以定义为 json get JSON obj Fields Result 这是正确的 当Result可以通过以下方式恢复 中的字段链Fields 列表 从JSON obj 一个字段 代表
  • prolog跟踪如何使用

    跟踪prolog程序时如何进行第二步 例如 我想跟踪以下简单程序 length1 0 length1 X Xs N length1 Xs N1 N is N1 1 我跟踪程序 trace length 1 2 3 N Call 7 leng
  • 下面代码中的修剪选择点如何使其更加高效(Prolog)?

    在下面给出的代码中 有 cut 修剪选择点以提高效率 我非常确定reverse谓词和agent do moves谓词是必不可少的 solve task Task Cost agent current position oscar P sol
  • check/3 谓词从列表中获取替代元素

    我有一个谓词check 3用作 例如 check A B C 所有三个参数都是列表 C是主列表 A包含具有奇数索引的项目 B包含具有偶数索引的项目 例如 check 1 3 2 4 1 2 3 4 is true check 1 2 3 4

随机推荐

  • $.AjaxFileUpload 在最新版本的 Chrome 版本 83.0.4103.61(官方版本)(64 位)中无法运行

    从最新版本的 Chrome 版本 83 0 4103 61 官方版本 64 位 开始 Jquery AjaxFileUpload 不起作用 如果有人有想法请帮助我 这个 AJAX 调用在旧版本的 chrome 和其他浏览器 如 firefo
  • 导航栏中的下拉菜单

    所以我正在网上学习CSS 发现这段代码有点令人困惑 因为如果我删除 dropbtn 类 输出没有任何变化 为什么它放在 li a 旁边 为什么删除对输出没有影响吗 帮助将不胜感激 谢谢 这是一段代码
  • 快速计算滑动窗口上事件的方法

    假设我有x rnorm 100000 而不是做一个1000长度滑动窗口移动平均线 我想做一个1000计算所有时间的长度滑动窗口x上面是0 2 例如 x lt rnorm 1004 start lt 1 1000 record lt list
  • 服务 JSONP 的最佳内容类型?

    我有一个 web 服务 当调用时不指定回调将返回一个 JSON 字符串application json作为内容类型 当指定回调时 它会将 JSON 字符串包装在回调函数中 因此它不再是真正有效的 JSON 我的问题是 我应该将其作为appl
  • 再次容器内联块

    看这个 我想制作一个主容器 它有 2 个子容器 左 右 各占屏幕宽度的 50 左边必须包含一张照片 右侧必须包含文本 h2 和 p 正下方 文本应该位于图像的中间 我需要它来描述商店中的产品 我正在尝试这个 div border 1px s
  • 为 Gradle 中的所有项目配置存储库

    我正在尝试为所有子项目配置存储库 我有主要的build gradle buildscript repositories mavenLocal mavenCentral google jcenter dependencies NOTE Do
  • 声明未初始化变量的更好方法

    一些 libc 函数 例如sigemptyset set mut sigset t 获取一个指向变量的指针 将其视为未初始化并初始化它 我最终得到这个代码 let mut newmask std mem uninitialized libc
  • System.Text.Json 和多态代码:不适用于 WebApi 控制器

    随着 NET 7 0 的发布 System Text Json应该支持多态代码 不幸的是 当您需要从控制器的方法返回派生类型的实例时 它似乎无法开箱即用 例如 假设以下模型 public class Base public class De
  • java中的密钥库密码加密

    我需要在调用远程队列之前设置以下变量 System setProperty javax net ssl trustStore C certs trustStore jks System setProperty javax net ssl k
  • 通过 Chrome 扩展程序在 Facebook 上分享

    我想通过 chrome 扩展在 facebook 墙上分享当前打开的选项卡 url 为此 我正在使用https facebook com share php早些时候 它首先给我登录选项 然后是共享框 由于 facebook 已弃用此方法 我
  • 在 Swift 中动画字符串淡入/淡出

    我是编程新手 但在过去的两个月里 我在 iOS 版 Swift 的学习上取得了长足的进步 我正在制作一个简单的打字游戏 我构建项目的方式是我有一个隐藏的UITextView检测玩家按下的字符 然后将该字符串与可见的字符串相匹配UITextV
  • 使用 chdir() 从终端更改目录

    我在用chdir 将目录更改为作为参数传递给该函数的值 我明白当我使用运行我的C程序时gcc myCd c and a out 这会将目录更改为 C 程序 内 的父目录 即为 a out 进程生成一个子进程 并且目录的更改发生在该子进程内
  • 什么是堆栈溢出错误?

    什么是StackOverflowError 是什么原因造成的 应该如何处理 参数和局部变量分配在stack 对于引用类型 对象位于heap堆栈中的变量引用堆上的该对象 堆栈通常位于upper地址空间的末尾 当它用完时 它会流向bottom地
  • Flutter Web - 获取 Firestore 集合

    我有一个 flutter 移动应用程序 效果非常好 但是当尝试将相同的代码迁移到 flutter web 时 我无法使用 就像 StreamBuilder 不想在 Web 模式下工作 而只适用于移动应用程序模式 在 dart 文件的顶部 我
  • 如何使用 Selenium 单击 cloudflare 的“验证您是人类”复选框挑战

    我需要使用 Python 自动下载此网页中的 csv 文件 https pace coe int en aplist committees 9 commission des questions politiques et de la dem
  • 是否可以在onTaskRemoved中执行网络任务?

    我需要当我的应用程序完全关闭 从后台清除 时将我的请求发布到服务器 并且当响应服务停止工作时 这是我的服务类 public class OnClearFromRecentService extends Service private Sha
  • 如何在 Swift 中使 NSBundle 的缓存失效

    当我尝试本地化字符串时 它返回以前的值 我发现在这个帖子您实际上必须使缓存无效 或多或少这是我尝试过的代码 里面localizableStringsPath该文件实际上显示了我从 inet 下载的翻译 但捆绑包返回了以前的值 我必须关闭应用
  • JS 异步/等待 vs Promise vs 回调

    我试图理解这 3 个回调和承诺之间的区别 但我不明白 async await 的用法 我知道这是承诺的语法糖 但我尝试过的方法没有用 我正在分享我试图理解这一切的一段代码 我尝试过使用数组 var array 1 2 3 和 2 个功能 g
  • 如何“安装”log4j 包?

    我已经下载了 Eclipse 插件的代码 该代码使用 log4j 但它不仅仅将其用作库 称为 jar 而是用作 捆绑包 所以它无法编译 原因如下 无法解析捆绑包 org apache log4j 我不太确定解决这个问题的正确方法是什么 我知
  • 如何验证坐标是否在列表中

    我正在生成随机坐标并添加到我的列表中 但首先我需要验证该坐标是否已经存在 我正在尝试使用member但是当我调试时我发现它不起作用 我的代码基本上是这样的 L is a list and Q is a count that define t