- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
抱歉,如果我的术语不正确。长期(40 年?哎哟......)命令式程序员,涉足功能,今天早上花了一些时间试图更认真地对待声明式。通过一个学习网站,并决定在这里尝试练习 2.4 中的“填字游戏”:http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse7
我明白了,但感觉笨拙得可笑。这是我的新手解决方案:
word(astante, a,s,t,a,n,t,e).
word(astoria, a,s,t,o,r,i,a).
word(baratto, b,a,r,a,t,t,o).
word(cobalto, c,o,b,a,l,t,o).
word(pistola, p,i,s,t,o,l,a).
word(statale, s,t,a,t,a,l,e).
crossword(V1,V2,V3,H1,H2,H3):-
word(V1,V1a,V1b,V1c,V1d,V1e,V1f,V1g),
word(V2,V2a,V2b,V2c,V2d,V2e,V2f,V2g),
word(V3,V3a,V3b,V3c,V3d,V3e,V3f,V3g),
word(H1,H1a,H1b,H1c,H1d,H1e,H1f,H1g),
word(H2,H2a,H2b,H2c,H2d,H2e,H2f,H2g),
word(H3,H3a,H3b,H3c,H3d,H3e,H3f,H3g),
V1b = H1b,
V1d = H2b,
V1f = H3b,
V2b = H1d,
V2d = H2d,
V2f = H3d,
V3b = H1f,
V3d = H2f,
V3f = H3f,
not(V1 = V2),
not(V1 = V3),
not(V1 = H1),
not(V1 = H2),
not(V1 = H3),
not(V2 = V3),
not(V2 = H1),
not(V2 = H2),
not(V2 = H3),
not(V3 = H1),
not(V3 = H2),
not(V3 = H3),
not(H1 = H2),
not(H1 = H3),
not(H2 = H3).
它有效。填字游戏会给我两种可能的布局(毕竟拼图是对称的)。但是是的...
一些笨拙只是因为我才刚刚开始,所以我对如何将绑定(bind)标记为“不关心”(单词的第 1、3、5 和 7 个字母)没有任何感觉完全无关紧要,例如)。但现在真正让我恼火的是最后不得不放入“不要复制任何绑定(bind)”的三角矩阵。这个问题不断出现(一个早期的玩具问题涉及爱(A,B)和嫉妒(X,Y),如果你允许 X=Y 那么每个开始恋爱关系的人都声称嫉妒自己(我看到有人else 几年前曾与:Get unique results with Prolog )) 打过交道,但本教程没有解决它。它甚至还没有告诉我关于“不”的信息——我不得不在其他地方四处挖掘才能得到它,这导致了完全有效的问题“好吧,你想要什么样的‘不等于’?”,我是目前还没准备好回答。但我离题了……
我无法想象这是在实际代码中实际完成的方式。结合起来,这是荒谬的。它似乎违反了(或至少是扭曲了)最小惊讶原则。在没有唯一性限制的情况下,仅设置 V1=H1,V2=H2,V3=H3 的解决方案数量巨大。我想我只能禁止那些,但真正的解决方案需要进行全面限制。
是的,我完全理解逻辑上和数学上没有理由不将相同的值绑定(bind)到多个参数,而且在很多情况下,这样的多重绑定(bind)不仅有用,而且需要处理手头的问题.我根本不是在争论默认行为,只是在寻找一种更好的方式来在我需要时表达唯一性约束。
我很想知道一个更好的方法来处理这个问题,因为老实说,如果这些教程都需要这么多的废话来做一些看似显而易见的事情,我认为我无法更深入地研究这些教程。
提前致谢!
最佳答案
在我看来,这个练习让你为失败做好准备。
首先,因为它使用的知识表示不适合以统一的方式处理相似的元素。
其次,因为在本书的这一点上你没有必要的先决条件来这样做,即使知识表示会使它更容易。
我可以向您保证:在 Prolog 中编程时,您所做的当然不需要。
所以,不要让一本书分散你对这门语言的注意力。
在这一点上,我想向您展示如果您对该语言有更多经验并使用更合适的语言功能,您可以如何解决此任务。当您阅读了其他 Material 后,您可能会喜欢回到这里。
我想做的关键改变是让你更明确地推理可用的词,作为你程序中可用的数据结构,而不是“仅”作为事实:
words(Ws) :- Ws = [[a,s,t,a,n,t,e], [a,s,t,o,r,i,a], [b,a,r,a,t,t,o], [c,o,b,a,l,t,o], [p,i,s,t,o,l,a], [s,t,a,t,a,l,e]].
当然,您可以使用 all-solutions 谓词(例如 findall/3
)自动轻松地获得这种显式(有时称为空间)表示>.
我现在介绍的关键谓词让我们可以将此表示中的单词与其每隔一 个字母相关联:
word_evens([_,A,_,B,_,C,_], [A,B,C]).
请注意,如果您可以明确推理构成单词的字母列表,那么表达这种关系是多么容易。
现在,整个解决方案,使用谓词 permutation/2
和 transpose/2
,您可以在 Prolog 系统中将其作为库谓词找到,或者也可以实现轻松自己:
solution(Ls) :- Ls = [V1,V2,V3,H1,H2,H3], words(Ws), Ws = [First|_], maplist(same_length(First), Ls), maplist(word_evens, [H1,H2,H3], Ess), transpose(Ess, TEss), maplist(word_evens, [V1,V2,V3], TEss), permutation(Ws, Ls).
示例查询和两种解决方案:
?- solution(Ls).Ls = [[a, s, t, a, n, t, e], [c, o, b, a, l, t, o], [p, i, s, t, o, l|...], [a, s, t, o, r|...], [b, a, r, a|...], [s, t, a|...]] ;Ls = [[a, s, t, o, r, i, a], [b, a, r, a, t, t, o], [s, t, a, t, a, l|...], [a, s, t, a, n|...], [c, o, b, a|...], [p, i, s|...]] ;false.
至少 maplist/2
应该在您的 Prolog 中可用,如果您的系统不提供,same_length/2
很容易定义。
如果你真的想表达术语的不平等,使用 prolog-dif .
关于prolog - 获取 "unique"绑定(bind)的更简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50417278/
我正在努力实现以下目标, 假设我有字符串: ( z ) ( A ( z ) ( A ( z ) ( A ( z ) ( A ( z ) ( A ) ) ) ) ) 我想编写一个正则
给定: 1 2 3 4 5 6
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
大家好,我卡颂。 Svelte问世很久了,一直想写一篇好懂的原理分析文章,拖了这么久终于写了。 本文会围绕一张流程图和两个Demo讲解,正确的食用方式是用电脑打开本文,跟着流程图、Demo一
身份证为15位或者18位,15位的全为数字,18位的前17位为数字,最后一位为数字或者大写字母”X“。 与之匹配的正则表达式: ?
我们先来最简单的,网页的登录窗口; 不过开始之前,大家先下载jquery的插件 本人习惯用了vs2008来做网页了,先添加一个空白页 这是最简单的的做法。。。先在body里面插入 <
1、MySQL自带的压力测试工具 Mysqlslap mysqlslap是mysql自带的基准测试工具,该工具查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出
前言 今天大姚给大家分享一款.NET开源(MIT License)、免费、简单、实用的数据库文档(字典)生成工具,该工具支持CHM、Word、Excel、PDF、Html、XML、Markdown等
Go语言语法类似于C语言,因此熟悉C语言及其派生语言( C++、 C#、Objective-C 等)的人都会迅速熟悉这门语言。 C语言的有些语法会让代码可读性降低甚至发生歧义。Go语言在C语言的
我正在使用快速将 mkv 转换为 mp4 ffmpeg 命令 ffmpeg -i test.mkv -vcodec copy -acodec copy new.mp4 但不适用于任何 mkv 文件,当
我想计算我的工作簿中的工作表数量,然后从总数中减去特定的工作表。我错过了什么?这给了我一个对象错误: wsCount = ThisWorkbook.Sheets.Count - ThisWorkboo
我有一个 perl 文件,用于查看文件夹中是否存在 ini。如果是,它会从中读取,如果不是,它会根据我为它制作的模板创建一个。 我在 ini 部分使用 Config::Simple。 我的问题是,如果
尝试让一个 ViewController 通过标准 Cocoa 通知与另一个 ViewController 进行通信。 编写了一个简单的测试用例。在我最初的 VC 中,我将以下内容添加到 viewDi
我正在绘制高程剖面图,显示沿路径的高程增益/损失,类似于下面的: Sample Elevation Profile with hand-placed labels http://img38.image
嗨,所以我需要做的是最终让 regStart 和 regPage 根据点击事件交替可见性,我不太担心编写 JavaScript 函数,但我根本无法让我的 regPage 首先隐藏。这是我的代码。请简单
我有一个非常简单的程序来测量一个函数花费了多少时间。 #include #include #include struct Foo { void addSample(uint64_t s)
我需要为 JavaScript 制作简单的 C# BitConverter。我做了一个简单的BitConverter class BitConverter{ constructor(){} GetBy
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我是 Simple.Data 的新手。但我很难找到如何进行“分组依据”。 我想要的是非常基本的。 表格看起来像: +________+ | cards | +________+ | id |
我现在正在开发一个 JS UDF,它看起来遵循编码。 通常情况下,由于循环计数为 2,Alert Msg 会出现两次。我想要的是即使循环计数为 3,Alert Msg 也只会出现一次。任何想法都
我是一名优秀的程序员,十分优秀!