为什么在具体化中将 clpfd 变量分配给实际值?

2024-04-26

我正在开发一个 (SWI-)Prolog 程序,该程序使用 CLP(FD) 约束来找到特定问题的解决方案。为此,我碰巧需要两个列表的“未定位”重叠。那是:

  • List La长度为A
  • List Lb长度为 B
  • A > B
  • 未定位的重叠列表是La+Lb,其中元素以一对一的方式添加。

但是,我需要Lb有一个可变偏移量(即每个列表的第一个元素不在相同位置La+Lb添加。然而,列出Lb始终在宽度内La。例如:

Be La = [0,1,1,1,1,0,1,1,1] and Lb = [1,2,2].

可能的情况1

(Lb) 1 2 2 . . . . . . ---> offset = 0
(La) 0 1 1 1 1 0 1 1 1
( +) 1 3 3 1 1 0 1 1 1   

可能的情况2

(Lb) . . . 1 2 2 . . . ---> offset = 3
(La) 0 1 1 1 1 0 1 1 1
( +) 0 1 1 2 3 2 1 1 1   

可能的情况3

(Lb) . . . . . 1 2 2 . ---> offset = 5
(La) 0 1 1 1 1 0 1 1 1
( +) 0 1 1 1 1 1 3 3 1   

我想要的是定义offset as a clpfd具有与其关联的特定域的变量。为了计算La+Lb我已经写了谓词overlap/6,如下所示:

overlap([],[],_,_,_,[]) :- !.
overlap([],_, _,_,_,[]) :- !.
overlap(A, [],_,_,_, A) :- !.
overlap(A, _,Os,_,_, A) :- length(A,L), L =< Os, !.
overlap([A|As],[B|Bs],0,Os,S,[A|Ls]) :-  % Os is the actual Offset 
    A #= B #<== S #= Os,                 % S is a clpfd variable
    overlap(As,Bs,0,Os,S,Ls),!.
overlap([A|As],Bs,Acc,Os,S,[A|Ls]) :-
    Acc > 0,
    Acc0 is Acc-1,
    overlap(As,Bs,Acc0,Os,S,Ls),!.

想法是找到La+Lb通过致电overlap/6然后,与indomain(S),使数字收敛到加法的特定解。我的问题是当 Prolog 到达该行时A #= B #<==> S #= Os, S被分配给Os(案例偏移值),而不是约束A具有具体化的条件。

我是不是疯了,这毫无意义?有没有正确的方法来做我正在尝试的事情?提前致谢!

Edit:这个想法是打电话overlap/6对于其中的每个点S的域,并使用此约束列表来标记适当的S然后。

统一示例:

?- S in 0..2,
   L0 = [0,0,0,0],
   overlap(L0, [1,2], 0, S, L1),
   overlap(L1, [1,2], 1, S, L2),
   overlap(L2, [1,2], 2, S, L).
L = [_G1, _G2, _G3, _G4]

_G1 in 0\/1
_G2 in 0\/1\/2
_G3 in 0\/1\/2
_G4 in 0\/2

_G1 #= 1 #<== S #= 0
_G1 #= 0 #<== S #> 0

_G2 #= 2 #<== S #= 0
_G2 #= 1 #<== S #= 1
_G2 #= 0 #<== S #> 2

_G3 #= 0 #<== S #= 0
_G3 #= 2 #<== S #= 1
_G3 #= 1 #<== S #< 2

_G1 #= 0 #<== S #= 0
_G4 #= 0 #<== S #= 1
_G4 #= 2 #<== S #= 2

Or:

?- S in 0..2,
   L0 = [0,0,0,0],
   overlap(L0, [1,2], 0, S, L1),
   overlap(L1, [1,2], 1, S, L2),
   overlap(L2, [1,2], 2, S, L),
   indomain(S).
S = 0
L = [1, 2, 0, 0]

如果与起始位置重叠S,我们期望连词的约束,以便覆盖所有重叠的位置。例如:

:- use_module(library(clpfd)).

overlap_at(As, Bs, S, ABs) :-
        length(As, L),
        L1 #= L - 1,
        S in 0..L1,
        overlap_at_(As, Bs, S, 0, ABs).

overlap_at_([], _, _, _, []).
overlap_at_([A|As], Bs, S, N0, [AB|ABs]) :-
        overlap_here(Bs, [A|As], [AB|ABs], Conj),
        S #= N0 #==> Conj,
        S #> N0 #==> AB #= A,
        N1 #= N0 + 1,
        overlap_at_(As, Bs, S, N1, ABs).

overlap_here(_, [], _, 1) :- !.
overlap_here([], _, _, 1).
overlap_here([B|Bs], [A|As], [AB|ABs], (AB #= A + B #/\ Rest)) :-
        overlap_here(Bs, As, ABs, Rest).

请注意我如何描述连词overlap_here/4.

示例查询:

?- overlap_at([0,1,1,1,1,0,1,1,1], [1,2,2], 3, ABs).
ABs = [0, 1, 1, 2, 3, 2, _G909, _G912, _G915],
_G909 in inf..sup,
_G912 in inf..sup,
_G915 in inf..sup.

这为您提供了解决方案的很大一部分:所有元素直到并包括重叠根据需要实例化。第三个参数当然也可以是一个变量:尝试例如

?- overlap_at([0,1,1,1,1,0,1,1,1], [1,2,2], S, ABs), 
   indomain(S), writeln(ABs), false.

其结果如下:

[1,3,3,_,_,_,_,_,_]
[0,2,3,3,_,_,_,_,_]
[0,1,2,3,3,_,_,_,_]
[0,1,1,2,3,2,_,_,_]
[0,1,1,1,2,2,3,_,_]
[0,1,1,1,1,1,3,3,_]
[0,1,1,1,1,0,2,3,3]
[0,1,1,1,1,0,1,2,3]
[0,1,1,1,1,0,1,1,2]

我将其余部分作为练习:不受重叠影响的尾随位置需要等于A。另外,您可能想进一步限制重叠的可能位置,我对此保持了相当笼统的态度。

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

为什么在具体化中将 clpfd 变量分配给实际值? 的相关文章

  • 理解 Haskell 中的矩阵转置函数

    这个矩阵转置函数有效 但我试图理解它的逐步执行 但我不明白 transpose a gt a transpose transpose x map head x transpose map tail x with transpose 1 2
  • 如何在批处理中返回数组的元素?

    我的程序中的数组列表中有两个元素 如何将变量分配给等于其中一个元素 这是代码 echo off setlocal enabledelayedexpansion set p string for l a in 0 1 1000 do if n
  • 自动滚动的实时行情(如 Twitter 的“热门推文”)

    是否有一个好的 Javascript 库可以生成自动滚动列表 例如 Twitter 主页上的 热门推文 最好作为 jQuery 插件 它还应该支持 AJAX 功能 动态添加新列表项 由于我们对现有的解决方案并不满意 因此我们从头开始实施了一
  • PyKCS11 不可哈希列表

    我的 python 脚本旨在获取特定 so 库中插槽 令牌的详细信息 输出如下所示 Library manufacturerID Safenet Inc Available Slots 4 Slot no 0 slotDescription
  • 使用 List.Sort(Comparison Comparison 在 C# 中对列表进行排序

    我创建了一个类 如下所示 public class StringMatch public int line num public int num of words 我创建了一个列表 List
  • 从字典列表中删除具有重复值的字典

    我有一个字典列表如下 ppm error 5 441115144810845e 07 key Y7 obs ion 1054 5045550349998 ppm error 2 3119997582222951e 07 key Y9 obs
  • python统计前10名

    使用Python 2 6 我有很大的文本文件 以下是前 3 个条目 但我需要检查超过 50 个用户 html log jeff 1153 3 1 84 625 54 1 2 71 3 2 10 7 58 499 3 5 616 36 241
  • Python列表切片效率

    在下面的代码中 def listSum alist Get sum of numbers in a list recursively sum 0 if len alist 1 return alist 0 else return alist
  • 确定非空列表条目是否“连续”的 Pythonic 方法

    我正在寻找一种方法来轻松确定列表中所有非 None 项目是否出现在单个连续切片中 我将使用整数作为非 None 项目的示例 例如 列表 None None 1 2 3 None None 满足我对连续整数条目的要求 相比之下 1 2 Non
  • 从列表中删除重复元素

    我开发了一个数组列表 ArrayList
  • 列表中的连续元素

    我正在阻止一个谓词来编码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
  • 将大块位图转换为 3 维位图

    Problem 我需要这个大量的数据作为输入 对于基于C的arduino 这是上面示例中所需格式的大量数据 const byte bitmap 8 8 0xFF 0x81 0x81 0x81 0x81 0x81 0x81 0xFF 0x81
  • 递归地更改R中嵌套列表中的名称

    我在 R 中的嵌套列表结构中有数据 我想使用查找表来更改名称 无论它们在结构中的位置 例子 build up an example x lt as list c a NA x 1 lt vector list 4 names x 1 lt
  • 适合从记录中提取 OneToMany 关系的约束编程

    也许有人可以帮助我解决 Prolog 或任何约束编程语言的问题 想象一个项目表 学生与母亲一起做某事的学校项目 每个项目都有一名或多名儿童参与 对于每个孩子 我们存储其姓名及其母亲的姓名 但对于每个项目 只有一个包含所有母亲的单元和一个包含
  • 索引多列并匹配不同的值,返回跨列的唯一值列表

    我已经在漫长的几周内广泛寻找解决我的问题的方法了 我提出了一个部分有效的解决方案 我将其包含在底部 供那些可能知道如何修改 扩展它们以解决问题的人使用 这就是我想要完成的任务 以下描述参考此屏幕截图https i stack imgur c
  • 如何创建仅包含某些可扩展项目的列表?

    我正在尝试编写一个包含一些可扩展项目和一些单个项目的列表 我希望拥有它 以便当单击单个项目或可扩展列表子项时 我可以根据该项目的文本调用意图 我认为可扩展列表可以工作 但是有没有办法在可扩展列表中设置项目 以便它们没有可扩展列表图标 我应该
  • Python 字符串到 SQL IN 参数的列表

    我在 python 中有这个查询 ssim group S1200 S1300 query select WIPMessageCnt from waferdata where recipename in s and equipment an
  • 如何删除/统计 s3 存储桶中的对象?

    所以我知道这是一个常见问题 但似乎没有任何好的答案 我有一个桶 里面有大量 我不知道有多少 文件 都在2k一个以内 1 我如何知道我有多少个这些文件没有列出他们 我使用过 s3cmd rb aws s3 和 jets3t 的东西 我能找到的
  • 在 C# 中枚举时从 List 中删除项目的智能方法

    我有一个经典的案例 尝试从集合中删除一个项目 同时在循环中枚举它 List
  • R 数据框到嵌套列表

    我想将这种格式的数据帧 tbl 转换为以下嵌套列表 tbllst library tidyr tbl lt tribble Col1 Col2 Col3 Var1 Var1 1 Var1 1 1 Var1 Var1 1 Var1 1 2 V

随机推荐

  • XDocument.Save() 无法访问文件

    希望我能够得到一些帮助来解决一个令人恼火的问题 我似乎无法在任何地方找到明确的答案 我使用 XDocument 对象将数据附加到 xml 文档 然后使用 xDoc save path 覆盖现有文件 但由于某种原因 我第一次运行代码时会抛出错
  • Grails 与 MongoDB、对象 id 和脚手架

    我使用集成测试和 Grails 脚手架将数据写入 mongoDB 数据库时遇到问题 当尝试从 列表 类型页面中选择域实例时 我收到错误 未找到 id null 的 域名 我确信这是因为 Grails url controller actio
  • XML 站点地图从 url 标记中删除 xmlns

    我正在使用下面的行来生成站点地图 但谷歌说有一个错误 我知道错误 但我无法弄清楚如何删除标签 THe code using System Xml Linq Layout null var urls new List
  • 从霍夫线中选择线

    I m using Hough Lines to do corner detection for this image i plan to find the intersection of the lines as the corner T
  • Java 中的生命游戏,人口过剩但不明白为什么

    这是家庭作业 我在底部添加了相关代码 Problem 在试图允许用户调整网格大小时 网格现在被绘制得严重过度填充 截图 人口过剩 https i stack imgur com 0Ilrq png https i stack imgur c
  • 使我的循环每 x 分钟后运行一次的函数

    我想要一个 r 函数 它使我的循环每 5 分钟运行一次 我有一个从谷歌财经下载市场数据的循环 我希望这个循环每 30 分钟运行一次 是否可以 使脚本循环的另一种方法是 使用外部作业调度工具在所需的时间间隔内调用脚本 如果你有linux 我建
  • R 中已知固定截距的线性回归

    我想使用 R 中的 lm 函数计算线性回归 此外 我想获得回归的斜率 其中我明确给出截距lm 我在互联网上找到了一个例子 我尝试阅读 R help lm 不幸的是我无法理解它 但我没有成功 谁能告诉我我的错误在哪里 lin lt data
  • Angular 2 路由器无法处理传递的多个参数

    我创建了一个示例 Plunker 将多个参数传递到下一页 但它不起作用 这是 Plunker 演示 其中单击项目后危机中心路由不起作用 http plnkr co edit ngNSsKBzAuhaP0EjKVJX p preview ht
  • NSSharingService 在默认电子邮件 MAC OSX 应用程序中设置抄送和密件抄送收件人

    我是 Mac OS X 应用程序开发的新手 我的问题很简单 我可以通过我的应用程序在默认邮件应用程序中设置收件人和正文文本 但我无法在邮件应用程序中设置抄送和密件抄送收件人 有没有办法通过代码设置CC和BCC 我正在使用Swift 我的设置
  • 无法解析“USERNAME”列

    我开发 Spring Framework MVC 应用程序 我也使用休眠 现在我为 User 实体制作简单的 POJO Entity Table name USERS public class User Column name USERNA
  • strdup 还是 _strdup?

    当我使用strdup在 Microsoft Visual C 中 它警告我 警告 C4996 strdup 此项目的 POSIX 名称已弃用 相反 请使用 ISO C 一致名称 strdup 详情请参见在线帮助 如此看来 strdup是正确
  • 为什么用“自我”。什么时候不被强迫?

    我注意到我的编码方式 糟糕 和我从其他人那里看到的代码之间存在差异 谁能解释一下为什么我看到有些人使用 self varname anotherpropertie When varname anotherpropertie 似乎也同样有效
  • 将对象从一个派生类更改为另一个派生类

    我有几个类共享一个公共基类 除了它们的方法工作方式不同之外 因此 在下面的示例中 加法器和乘法器除了执行计算的方式不同之外都是相同的 有没有办法即时将 a 更改为乘数 我是否需要实现派生类之间相互转换的方法 例如就像是 a a asMult
  • JQuery Internet Explorer 和 ajaxstop

    document ajaxStart function loading show document ajaxStop function loading hide 如何在 Internet Explorer 中调用 ajaxStop 事件 a
  • H2数据库,通过从CSVREAD选择结果插入

    我有一个 CSV 文件 例如 1 hello 13 2 world 14 3 ciao 26 我正在尝试使用CSVREAD函数将该文件读入数据库 如下所示 insert into my table id message code value
  • 使用 JGit TreeWalk 列出文件和文件夹

    我想使用 JGit 显示头部修订的所有文件和文件夹的列表 我可以使用 TreeWalk 列出所有文件 但这不会列出文件夹 这是我到目前为止所拥有的 public class MainClass public static void main
  • javax.xml.stream.XMLStreamException:[行,列]处的解析错误:[2,1](jboss-deployment-struct.xml)

    我希望我的应用程序使用验证 api 1 1 0 Finaljar 而不是容器提供的 jar验证 api 1 0 0 GAJBoss AS 7 1 1 附带 我创建了JBossjboss 部署 结构 xml如下
  • 当你说 Ruby 是反射型时,这主要是指“鸭子类型”吗?

    我正在读一篇描述 Ruby 的文章 其中写道 Ruby 被认为是 反思性的 语言 因为有可能 Ruby 程序分析自身 在 其构成条款 使 调整其工作方式 以及 甚至用其他代码覆盖自己的代码 代码 我对 反射 这个术语感到困惑 这主要是在谈论
  • 如何使 Flexbox 响应式?

    我有一个包含两个元素的 div 我想水平堆叠它们 Div C 具有固定宽度 div B 将填充其余空间 然而 div B 的内容可能是固定宽度 动态 或 100 宽度 div B 我想要的效果是 如果屏幕宽度足够小 以至于在 div B 和
  • 为什么在具体化中将 clpfd 变量分配给实际值?

    我正在开发一个 SWI Prolog 程序 该程序使用 CLP FD 约束来找到特定问题的解决方案 为此 我碰巧需要两个列表的 未定位 重叠 那是 List La长度为A List Lb长度为 B A gt B 未定位的重叠列表是La Lb