gpt4 book ai didi

prolog - 获取 "unique"绑定(bind)的更简单方法?

转载 作者:行者123 更新时间:2023-12-01 11:16:26 25 4
gpt4 key购买 nike

抱歉,如果我的术语不正确。长期(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/2transpose/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 - 获取 "unique"绑定(bind)的更简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50417278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com