基于 Term 的对象化数组

2024-01-01

我有这个数组:

ary1d_new(Size,Sym,ArySym,Ary) :- 
    functor(Ary,ArySym,Size), 
    forall(arg(X,Ary,_), nb_setarg(X,Ary,Sym)).
ary1d_get(Pos,Ary,Val) :- arg(Pos,Ary,Val).
ary1d_set(Pos,Ary,Val) :- nb_setarg(Pos,Ary,Val).

试图将其转换为 logtalk 对象,但对我来说没有发生

:- object(array, instantiates(array)).

    :- initialization(init).
    :- private(init/0).

    :- public(ary/1).
    :- dynamic(ary/1).
    ary(_).

    :- public([new1d/2, set1d/2, get1d/2]).

    new1d(Size,Sym) :- 
        functor(Ary,ary,Size), 
        forall(arg(X,Ary,_), nb_setarg(X,Ary,Sym)),writeln(Ary).
    get1d(Pos,Val) :- arg(Pos,::ary,Val).
    set1d(Pos,Val) :- nb_setarg(Pos,::ary,Val).

    init :- true.

:- end_object.

:- object(g, instantiates(array)).
:- end_object.


?- g::new1d(5,0).
ary(0,0,0,0,0)
true.

?- g::set1d(2,7).
false.

?- g::get1d(2,D).
false.

正确的方法是什么?函子 vs ::ary 让我很困惑


针对数组存储中的 Obj 属性提出了这个:

:- public(test/2).
test(Size, Value) :- test(Size,Value,i(Size)).
:- public(test/3).
test(Size, Value, Info) :-
    functor(A, s, Size),
    forall(
        arg(Arg, A, _),
        nb_setarg(Arg, A, Value)
    ),
    _Array_ = a(Info,A).

?- ary(A)::test(5,0).
A = a(i(5), s(0, 0, 0, 0, 0)).

请注意,您只能调用nb_setarg/3关于复合项参数。一个可能的替代方案是使用参数对象 https://logtalk.org/manuals/userman/objects.html#parametric-objects:

:- object(array(_Array_)).

    :- public(new/2).
    new(Size, Value) :-
        functor(_Array_, a, Size),
        forall(
            arg(Arg, _Array_, _),
            nb_setarg(Arg, _Array_, Value)
        ).

    :- public(get/2).
    get(Arg, Value) :-
        arg(Arg, _Array_, Value).

    :- public(set/2).
    set(Arg, Value) :-
        nb_setarg(Arg, _Array_, Value).

:- end_object.

示例查询如下:

?- {arrays}.
% [ .../arrays.lgt loaded ]
% (0 warnings)
true.

?- array(Array)::(new(5,0), set(2, 7), get(2, Value)).
Array = a(0, 7, 0, 0, 0),
Value = 7.

请注意,_Array_ 参数变量 is a 逻辑变量。因此,它无法从顶级查询到顶级查询:

?- array(Array)::(new(5,0), set(2, 7), get(2, Value)).
Array = a(0, 7, 0, 0, 0),
Value = 7.

?- array(Array)::new(5,0).
Array = a(0, 0, 0, 0, 0).

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

基于 Term 的对象化数组 的相关文章

  • 获取数组的第一个元素

    我有一个数组 array 4 gt apple 7 gt orange 13 gt plum 我想获取这个数组的第一个元素 预期结果 字符串apple 要求一 它不能通过引用传递来完成 so array shift这不是一个好的解决方案 我
  • 指向数组的指针 int (*ptr)[]

    我想了解指向数组的指针如何工作 代码片段 include
  • 将键上的对象数组和总和值减少到数组中

    我有以下对象 data name foo type fizz val 9 name foo type buzz val 3 name bar type fizz val 4 name bar type buzz val 7 并使用 loda
  • JS jQuery - 检查值是否在数组中

    我更喜欢 PHP 而不是 JS 我认为我的问题更多是语法问题 我有一个小的 jQuery 来 验证 并检查输入值 它适用于单个单词 但我需要数组 我正在使用inArray jQuery 的 var ar value1 value2 valu
  • 这里不允许使用数组初始值设定项[重复]

    这个问题在这里已经有答案了 我正在开发 Android 项目 但收到一个我无法理解的错误 这里不允许使用数组初始值设定项 我试图简化我的代码 结果归结为这一点 public class MainActivity extends Activi
  • python 和回文

    我最近写了一个循环的方法 usr share dict words并使用我的返回回文列表ispalindrome x 方法 这是一些代码 有什么问题吗 它只会停止 10 分钟 然后返回文件中所有单词的列表 def reverse a ret
  • 最后一项具有不同类型的元组(首先从剩余元素开始)

    我有一个类型Foo那是一个Array可以包含任意数量的Bar元素 带有可选的最后一个Qux元素 以下是一些有效数据的示例 bar qux bar qux bar bar bar bar bar bar bar bar qux 无效数据示例
  • 如何获取 ndarray 的 x 和 y 维度 - Numpy / Python

    我想知道是否可以分别获取 ndarray 的 x 和 y 维度 我知道我可以使用ndarray shape获取表示维度的元组 但如何在 x 和 y 信息中分离它 先感谢您 您可以使用元组拆包 y x a shape
  • 查找数组中总和等于给定值的最小元素

    我试图找出数组中总和等于的最小元素 给定的输入 我尝试了几个输入总和 但只能找到一个 在第一种情况下配对 而我需要实现的不仅仅是一对 var arr 10 0 1 20 25 30 var sum 45 var newArr console
  • 问题 - 序言中的形式语言

    我正在尝试构建一个 DCG 它可以识别与此形式匹配的所有列表 a n b 2m c 2m d n 我写下了以下规则 s gt s gt ad ad gt a ad d ad gt bc bc gt b b bc c c bc gt a gt
  • 整数的十进制表示形式中的分隔数字

    例如 我想将用户输入作为整数输入 45697 并将前两位数字存储在数组 向量或其他内容中 例如 4 5 6 9 7 这样我就可以使用一些函数调用来检查前两个值 4 5 并对它们进行计算 问题 我不知道如何存储恢复前两个值 有没有简单的函数调
  • Swit 中的函数式编程将数组元素分配到正确的“桶”

    我是函数式编程的新手 我的问题是我有一个主数组和固定数量的 目标 数组 我想根据每个元素的特定值将主数组中的元素分配到正确的结果数组中 我猜测一种方法是使用一个映射函数来遍历主数组元素 确定正确的 目标数组 值 基于某种逻辑 然后将元素添加
  • 如何判断变量是否是数组

    我有一个接受 Any 的 Swift 函数 我希望它能够接受字符串数组 整数数组 混合数组或数组数组等 它也可以只接受字符串或整数 等等 不在数组中 所以我有这个 private func parse parameter Any if pa
  • 在 C 中使用另一个结构中的二维结构数组的编码问题

    我正在使用一个二维结构数组 它是另一个结构的一部分 这不是我做过很多事的事情 所以我遇到了问题 该函数在接近末尾的 测试 for 循环后最终失败 它在出现段错误之前正确打印出一行 我的代码中将数据读入虚拟二维结构数组的部分工作得很好 所以它
  • SWI Prolog 使用的检查优化会发生什么情况?

    去引用SICStus Prolog 手册 https sicstus sics se sicstus docs 3 12 9 html sicstus Occur html 逻辑编程背后的通常数学理论禁止 创建循环项 规定发生检查应该是 每
  • 如果数组重叠,则折叠多行数组

    我在 PostgreSQL 9 3 中有一个表 其中包含一个列 每行包含一个数组 我正在努力寻找崩溃的方法 共享相同元素的数组行 Examples 简单重叠 给定以下两行数组 1 2 3 5 3 6 9 结果将是一行包含 5 1 2 3 6
  • 为什么超过44个字符时打印随机符号

    我正在从 C 编程 现代方法 一书中学习 C 现在我正在进行有关数组的练习 练习之一是编写一个过滤器 以不同的方式打印输入消息 到目前为止 参见下面的代码 一切正常 直到字符数超过 44 然后它打印随机符号 如果字符数低于 44 则一切正常
  • 除括号中的空格外,将字符串拆分为所有空格

    我正在尝试将文本拆分为以下内容 例如在空格上 var line Text what is what s a story fable called named about Search Title 但我希望它忽略括号内的空格 这应该产生一个数
  • 如何读取数组中int的随机数

    我想将空格分隔的整数读取到数组中 当我按 Enter 时 它应该在任何时间点停止读取 如何实现该程序的循环 请帮助我解决这个问题 我已经尝试过下面的代码 但它不起作用 以及如何再次读回 include
  • 如何从对应的数组值中获取数组键?

    您可以轻松地通过其键获取数组值 如下所示 value array key 但如果我有该值并且想要它的密钥怎么办 获得它的最佳方式是什么 你可以使用array search https www php net manual en functi

随机推荐

  • Android:以编程方式创建滑动手势事件

    我一直试图在谷歌上找到这个特定案例的答案 但令人惊讶的是在任何地方都找不到它 只有关于检测的答案 而不是关于创建 滑动的答案 我想在屏幕上实际 运行 从右到左的模拟滑动 无论在哪里 但最好是从右边缘到左 我尝试了类似的方法 但我得到了 NP
  • Sed - 替换每行最后出现的匹配项

    所以我有以下文件 Carlton 3053 Carlton North 3054 Docklands 3008 East Melbourne 3002 Flemington 3031 Kensington 3031 Melbourne 30
  • ios9 中日期选择器不正确

    早上好 我在 ios 9 swift 2 中的日期选择器有问题 this is how my datepicker looks like in ios 8 swift 2 OK and this is my datepicker in io
  • 从 QuickTime MOV 文件解析 h.264 NAL 单元

    我正在尝试从 iPhone 上的 MOV 文件获取 h 264 NAL 单位 以便将 RTP h 264 视频从 iPhone 摄像头传输到服务器 Apple 的 API 不允许直接访问来自相机输出的编码比特流 因此我只能在写入 MOV 文
  • 在 EF4 中使用 NOLOCK 提示?

    我们正在评估 EF4 我的 DBA 说我们必须在所有 SELECT 语句中使用 NOLOCK 提示 因此 我正在研究如何在使用 EF4 时实现这一点 我读过关于如何在 EF4 中实现这一点的不同想法 但所有这些似乎都是一种变通方法 并未得到
  • 验证..让我发疯

    每次我运行我的应用程序 设备或模拟器是相同的 即使没有对代码进行任何更改 我也会从最大的 Activity 中得到每个方法 W art Verification of void com xyz abx setCredit boolean t
  • Python XML 解析网站

    我正在尝试从网站解析 我被困住了 我将在下面提供 XML 它来自一个网站 我有两个问题 从网站读取 xml 的最佳方法是什么 然后我在挖掘 xml 以获得我需要的速率时遇到了麻烦 我需要返回的数字是 Base OBS VALUE 0 12
  • 在 R 中创建桑基图;使绘图输出可解释

    我第一次使用 R 创建桑基图 显示前因事件和后继事件之间的联系以及它们发生的次数 这是我正在使用的数据类型的模拟示例 df creation df lt structure list Antecedent c Activity 1 Acti
  • 如何减少内存使用并加快代码速度

    我正在使用包含 5 列和超过 9000 万行的庞大数据集 该代码对于部分数据工作正常 但是当涉及到整个数据时 我得到了内存错误 我读过有关生成器的内容 但它对我来说似乎非常复杂 我可以根据这段代码得到解释吗 df pd read csv D
  • PowerShell - 在远程计算机上执行脚本时出现错误

    以下内容对我不起作用 WINDIR System32 WindowsPowerShell v1 0 powershell exe NoProfile Noninteractive command Invoke Command Compute
  • Android Honeycomb 中的操作栏样式

    我想使用主题和样式设置操作栏 蜂窝 的背景 你可以用代码来完成ActionBar setBackgroundDrawable Drawable 但是找不到对应的样式属性 我尝试过使用这个主题和风格Activity 但这会
  • 重构建议:映射到 POJO

    我目前参与的一个项目有一个这样的界面 public interface RepositoryOperation public OperationResult execute Map
  • Python 正则表达式中的重音字符

    这是我的代码 coding utf 8 import json import re with open Users paul Desktop file json as json file file json load json file p
  • SwiftUI TextField 在 ZStack 内的 VStack 中禁用(用 TextField 模拟警报)

    我需要发出警报SwiftUI有一个可编辑的文本域在里面 目前 SwiftUI 不支持此功能 截至Xcode 11 3 所以我正在寻找解决方法 我知道我可以通过将普通的 UIKit 位包装在UI托管控制器 但确实想坚持使用全 SwiftUI
  • 如何在JS中设置div内的值

    我有一些代码看起来像这样 document getElementById error style display block 当发生这种情况时 我还想显示应该显示的错误 该错误存储在另一个 JS 变量中 如何将该变量的值添加到 id err
  • CUFFT:当输入是倾斜数组时如何计算 fft

    我正在尝试查找动态分配数组的 fft 使用以下命令将输入 数组从主机复制到设备cudaMemcpy2D 然后进行 fft cufftExecR2C 并将结果从设备复制回主机 所以我最初的问题是如何在 fft 中使用音高信息 然后我在这里找到
  • 如何删除 php 帖子中的攻击性词语?

    假设 xyza 是一个坏词 我正在使用以下方法来替换攻击性词语 text str replace x Offensive words detected removed text 此代码会将 xyza 替换为 检测到并删除攻击性词语 但问题是
  • 调试本地 IIS Web 服务器上托管的 ASP.NET MVC3 应用程序

    我已经设法使用本地 IIS Web 服务器来托管我的 MVC3 应用程序 并且我可以调试它和所有内容 从托管它的机器 但是 当我从另一台计算机 我的 Mac 在 Parallels VM 中运行 Windows 发送请求时 我得到了预期的结
  • 将列表转换为一行 data.frame

    我有一个这样的列表 arg0 lt list code a n rep 10 3 列表中的对象数量是可变的 列表的对象是向量 只是一维对象 我想制定一个过程将列表转换为单行 data frame 如下所示 gt data frame cod
  • 基于 Term 的对象化数组

    我有这个数组 ary1d new Size Sym ArySym Ary functor Ary ArySym Size forall arg X Ary nb setarg X Ary Sym ary1d get Pos Ary Val