问题标签 [prolog-dif]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
list - 如何访问序言中的列表排列?
我想访问列表排列并将其作为参数传递给其他函数。
这是排列代码:
list - 序言列表高原
刚刚被介绍给prolog,试图完成一些简单的练习,但我一直在这个问题上卡住了。我正在尝试编写一个输出输入列表的所有子列表的程序,其中每个子列表的长度> 1,并且不能扩展到更大的子列表。它还将输出子列表列表中的起始位置。所以一个样本输出将是
我仍然对整个声明式的事情感到很困惑,并且在切换命令式模式时遇到了很多麻烦。我在想我希望我的程序做类似的事情
所以这行不通,从我可以说的几个原因来看。我没有重置“计数”,所以它可能会将所有子列表的值加起来?有没有办法解决这个问题?我的基本情况也可能不是我想要的——我只是不确定它应该是什么?我可能也错过了其他东西......非常感谢任何帮助!:) 谢谢!
prolog - 使用手动列表迭代与失败递归的优缺点是什么
我一直遇到这种情况,我永远不知道用哪种方法来攻击它。以下是处理某些季节事实的两种方法。
我正在努力解决的是使用方法1还是2,以及每种方法的优缺点,尤其是大量的事实。
methodone
似乎很浪费,因为事实是可用的,为什么还要建立一个列表(尤其是一个大列表)。如果列表足够大,这也一定会影响内存?而且它没有利用 Prolog 的自然回溯功能。
methodtwo
利用回溯为我进行递归,我想内存效率会更高,但是通常这样做是一种好的编程习惯吗?可以说它更丑陋,可能还有其他副作用吗?
我可以看到的一个问题是,每次fail
调用时,我们都失去了将任何东西传递回调用谓词的能力,例如。如果是methodtwo(SeasonResults)
,因为我们不断地故意使谓词失败。所以methodtwo
需要断言事实来存储状态。
大概(?)方法2会更快,因为它没有(大)列表处理要做?
我可以想象,如果我有一个清单,那methodone
将是要走的路……还是总是如此?methodone
在任何情况下使用方法二将列表断言为事实然后处理它们是否有意义?彻底的疯狂?
但是话又说回来,我读到断言事实是一项非常“昂贵”的业务,因此即使对于大型列表,列表处理也可能是要走的路?
有什么想法吗?或者有时根据(什么)情况使用一个而不是另一个更好?例如。对于内存优化,使用方法 2,包括断言事实,对于速度使用方法 1?
prolog - Prolog:临时列表存储
我是 Prolog 的新手,我被困在我正在尝试做的谓词上。它的目的是通过给定 P 的四边形列表 [X,Y,S,P] 进行递归,当四边形具有相同的 P 时,它将其存储在临时列表中。当它遇到一个新的 P 时,它会查看临时列表是否大于长度 2,如果是则将临时列表存储在输出列表中,如果小于 2 则删除四边形,然后再次开始递归新 P.
这是我的代码:
谢谢你的帮助!
list - Prolog:第一个重复值
我需要在列表中找到第一个重复值。
prep(3,[1,3,5,3,5]).
应该是真的。
prep(5,[1,3,5,3,5]).
应该是假的。
我想检查当前值和以前的列表成员是否相等,直到找到重复项,如果找到一个,它将测试与 X 是否相等,但我不知道如何在 Prolog 中做到这一点!
我很感激任何帮助!谢谢
prolog - Prolog 中的“谁是理发师”逻辑谜题
我正在阅读 Raymond Smullyan 的“To mock a Mockingbird”。书中有一个谜题是这样的:
这个故事中的塞维利亚与西班牙著名的塞维利亚(实际上没有)之间的任何相似之处纯属巧合。在这个神秘的塞维利亚小镇,男性居民在那些而且只有在他们喜欢的时候才会戴假发。没有两个居民在所有日子里都表现得一样;也就是说,给定任何两个男性居民,至少有一天其中一个戴假发而另一个不戴。给定任何男性居民 X 和 Y,如果 Y 在 X 所做的所有日子里都戴着假发,则据说居民 Y 是 X 的追随者。此外,给定任何居民 X、Y 和 Z,如果 Z 在 X 和 Y 都做的所有日子里都戴着假发,则说居民 Z 是 X 和 Y 的追随者。
其中五个居民被命名为 Alfredo、Bernardo、Benito、Roberto 和 Ramano。关于它们的已知事实如下:
事实 1.. Bernardo 和 Benito 在戴假发的习惯上是截然相反的;也就是说,在任何一天,其中一个戴假发,另一个不戴。
事实 2:罗伯托和拉马诺同样是对立的。
事实 3:拉马诺戴假发,而且只有在阿尔弗雷多和贝尼托都戴假发的日子里。
塞维利亚只有一位理发师,关于他的已知事实如下:
事实 4:贝尔纳多是阿尔弗雷多和理发师的追随者。
事实 5:给定任何男性居民 X,如果 Bernardo 是 Alfredo 和 X 的追随者,那么理发师只是 X 的追随者。
阿尔弗雷多只戴黑色假发;贝尔纳多只戴白色假发;Benito 只戴灰色假发;罗伯托只戴红色假发;拉马诺只戴棕色假发。
一个复活节的早晨,有人看到理发师戴着假发。他穿的是什么颜色的?
我发现在 Prolog 中解决这个问题会很有趣,但我很早就陷入了困境:
我不知道如何有效地编码某人跟随其他人,我不知道如何根据该信息进行推理。我在 Prolog 中关注了其他一些逻辑难题的解决方案,但我无法找到解决方案。
编辑:这是从 Smulyan 的书中复制的解决方案:
步骤 1:首先,我们证明 Roberto 是理发师的追随者。
好吧,考虑一下理发师戴假发的任何一天。阿尔弗雷多那天要么戴假发,要么不戴。假设阿尔弗雷多这样做。然后贝尔纳多那天也戴着假发,因为贝尔纳多是阿尔弗雷多和理发师的追随者。所以贝尼托那天不能戴假发,因为他是贝尔纳多的对面。然后拉马诺那天不能戴假发,因为他只在阿尔弗雷多和贝尼托都戴假发的日子里戴假发,而贝尼托这一天没有戴假发。既然拉马诺这一天不戴假发,那么罗伯托就必须戴,因为罗伯托是拉马诺的对面。这证明了在理发师戴假发的任何一天,如果阿尔弗雷多也戴假发,那么罗伯托也戴假发。
现在,理发师戴假发但阿尔弗雷多不戴假发的那一天呢?好吧,既然阿尔弗雷多不这样做,那么阿尔弗雷多和贝尼托当然也不会这样做;因此,根据事实 3,拉马诺没有,因此根据事实 2,罗伯托也这样做。所以罗伯托在理发师戴假发而阿尔弗雷多不戴的任何一天都戴假发——事实上,他在阿尔弗雷多不戴的所有日子里都戴假发。 t,不管理发师。这证明了在理发师戴假发的任何一天,罗伯托也戴假发,不管那天阿尔弗雷多戴假发还是不戴假发。所以罗伯托确实是理发师的追随者。
prolog - 为什么 Prolog 在这个简单的例子中会崩溃?
您好,上面是一个非常简单的 prolog 文件,其中包含一些事实和一条规则:John 喜欢任何喜欢他的人。但是在加载此文件并询问 Prolog 以下查询后:
程序崩溃。likes(john,john)
原因是即使规则规定了prolog 也会卡住X\=john
。
有什么建议吗?
prolog - 从列表中删除所有出现的元素
尝试编写一个给定一个值和一个列表的过程,它会删除该列表中所有出现的值 a 写:
由于cut
此代码无法正确回答以下查询:
如果我删除剪辑:
它在以下查询中失败:
(返回true
,当正确答案是false
)。
我怎样才能让它在这两种情况下都有效?
也许我可以X is not T
在第三行代码中检查一下,我试过了:
但它不起作用。
prolog - 在 Prolog 中解决文本逻辑难题 - 查找生日和月份
我正在阅读“7 天内的 7 种语言”一书,并且已经读到了 Prolog 章节。作为学习练习,我试图解决一些文本逻辑难题。谜题如下:
五姐妹的生日都在不同的月份和一周中的不同日子。使用下面的线索,确定每个姐妹的生日是星期几。
- 宝拉出生于三月,但不是星期六。阿比盖尔的生日不在周五或周三。
- 星期一生日的女孩比布伦达和玛丽出生得早。
- 塔拉不是二月份出生的,她的生日是在周末。
- 玛丽不是在十二月出生,她的生日也不是在工作日。那个六月份生日的女孩是星期天出生的。
- 塔拉在布伦达之前出生,布伦达的生日不是星期五。玛丽不是七月出生的。
对于有经验的 Prolog 程序员来说,我当前的实现可能看起来像是一个笑话。代码粘贴在下面。
我希望得到一些关于如何解决问题以及如何使代码既清晰又密集的意见。
IE:
- 我怎样才能避免输入限制说天数必须是唯一的。
- 我怎样才能避免输入月份必须是唯一的限制。
- 添加关于生日排序的限制。
更新根据 chac 的回答,我能够解决这个难题。按照同样的方法,我们(工作中的编程语言能力小组)也能够解决第二个难题。我已经在 GitHub 上发布了完整的实现和示例输出作为要点。
prolog - SWI Prolog 不会终止
为什么会?- is_fakt(X)
返回结果答案列表,但在获得多个结果答案后它会挂起。我不知道为什么 Prolog 不能返回 X 的所有可能值。