- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要使用 Prolog 解决 Ship Puzzle 问题。这是事实。
There are 5 ships.
- The Greek ship leaves at six and carries coffee.
- The Ship in the middle has a black chimney.
- The English ship leaves at nine.
- The French ship with blue chimney is to the left of a ship that carries coffee.
- To the right of the ship carrying cocoa is a ship going to Marseille.
- The Brazilian ship is heading for Manila.
- Next to the ship carrying rice is a ship with a green chimney.
- A ship going to Genoa leaves at five.
- The Spanish ship leaves at seven and is to the right of the ship going to Marseille.
- The ship with a red chimney goes to Hamburg.
- Next to the ship leaving at seven is a ship with a white chimney.
- The ship on the border carries corn.
- The ship with a black chimney leaves at eight.
- The ship carrying corn is anchored next to the ship carrying rice.
- The ship to Hamburg leaves at six.
Which ship goes to Port Said? Which ship carries tea?
我在互联网上搜索答案,但找不到任何答案。所以我引用了“The Zebra Puzzle”,因此我为这个问题安排了代码。所以这是我的 Prolog 代码的问题。
exists(A,(A,_,_,_,_)).
exists(A,(_,A,_,_,_)).
exists(A,(_,_,A,_,_)).
exists(A,(_,_,_,A,_)).
exists(A,(_,_,_,_,A)).
rightOf(A,B,(B,A,_,_,_)).
rightOf(A,B,(_,B,A,_,_)).
rightOf(A,B,(_,_,B,A,_)).
rightOf(A,B,(_,_,_,B,A)).
middleShip(A,(_,_,A,_,_)).
lastShip(A,(_,_,_,_,A)).
nextTo(A,B,(B,A,_,_,_)).
nextTo(A,B,(_,B,A,_,_)).
nextTo(A,B,(_,_,B,A,_)).
nextTo(A,B,(_,_,_,B,A)).
nextTo(A,B,(A,B,_,_,_)).
nextTo(A,B,(_,A,B,_,_)).
nextTo(A,B,(_,_,A,B,_)).
nextTo(A,B,(_,_,_,A,B)).
solution(PortSaidShip, TeaCarrier) :-
Shipes = (ship(_,_,_,_,_),ship(_,_,_,_,_),ship(_,_,_,_,_),ship(_,_,_,_,_),ship(_,_,_,_,_)),
exists(ship('Greek',6,'Coffee',_,_),Shipes),
middleShip(ship(_,_,_,_,'Black',_),Shipes),
exists(ship('English',9,_,_,_),Shipes),
rightOf(ship(_,_,'Coffee',_,_),ship('French',_,_,'Blue',_),Shipes),
rightOf(ship(_,_,_,_,'Marseille'),ship(_,_,'Cocoa',_,_),Shipes),
exists(ship('Brazilian',_,_,_,'Manila'),Shipes),
nextTo(ship(_,_,_,'Green',_),ship(_,_,'Rice',_,_),Shipes),
exists(ship(_,5,_,_,'Genoa'),Shipes),
rightOf(ship('Spanish',7,_,_,_),ship(_,_,_,_,'Marseille'),Shipes),
exists(ship(_,_,_,'Red','Hamburg'),Shipes),
nextTo(ship(_,_,_,'White',_),ship(_,7,_,_,_),Shipes),
lastShip(ship(_,_,'Corn',_,_),Shipes),
exists(ship(_,8,_,'Black',_),Shipes),
nextTo(ship(_,_,'Corn',_,_),ship(_,_,'Rice',_,_),Shipes),
exists(ship(_,6,_,_,'Hamburg'),Shipes),
exists(ship(PortSaidShip,_,_,_,'Port Said'),Shipes),
exists(ship(TeaCarrier,_,'Tea',_,_),Shipes).
但是当我运行程序时它会说'false'。
那我该如何解决呢?
谢谢
最佳答案
你问:
So how can I solve this?
以下是一种通用方法,它始终适用于像您这样的纯单调 Prolog 程序。你的实际问题是一个特定的目标应该成功,但它失败了。所以你遇到了意外失败。为了本地化您程序的负责部分,我们现在将系统地概括您的程序。一步步。直到我们有一个很小的程序片段。这种技术有时称为程序切片,有时称为程序修改。
首先,将以下内容添加到您的代码中:
:- op(950, fy, *).
*_.
:- initialization(solution(_Port, _Carrier)).
现在我们将通过在目标前面添加 *
一个接一个地删除目标,然后重新运行您的程序。因此请做好准备,您将重新运行您的程序几次。要加载程序,请在顶层输入:
?- [shipes].
这几乎适用于任何地方,例如 SICStus、GNU、SWI、YAP。您现在将收到有关“失败指令”或类似内容的警告。所以 - 高兴 - 因为您现在可以轻松地重现问题!
在最后一个目标处开始添加一个*
。你可以一次尝试几个。要在修改后重新加载,您可以重新输入该目标,或者
在 SICStus 中,更好的状态是 ensure_loaded(shipes)。
这将检查文件是否已被修改,并且仅在文件已重新加载时才重新运行
在 SWI 中,输入 make。
最后得到如下程序片段:
middleShip(A,(_,_,A,_,_)).solution(PortSaidShip, TeaCarrier) :- Shipes = (ship(_,_,_,_,_),ship(_,_,_,_,_),ship(_,_,_,_,_),ship(_,_,_,_,_),ship(_,_,_,_,_)), *exists(ship('Greek',6,'Coffee',_,_),Shipes), middleShip(ship(_,_,_,_,'Black',_),Shipes), *exists(ship('English',9,_,_,_),Shipes), *rightOf(ship(_,_,'Coffee',_,_),ship('French',_,_,'Blue',_),Shipes), *rightOf(ship(_,_,_,_,'Marseille'),ship(_,_,'Cocoa',_,_),Shipes), *exists(ship('Brazilian',_,_,_,'Manila'),Shipes), *nextTo(ship(_,_,_,'Green',_),ship(_,_,'Rice',_,_),Shipes), *exists(ship(_,5,_,_,'Genoa'),Shipes), *rightOf(ship('Spanish',7,_,_,_),ship(_,_,_,_,'Marseille'),Shipes), *exists(ship(_,_,_,'Red','Hamburg'),Shipes), *nextTo(ship(_,_,_,'White',_),ship(_,7,_,_,_),Shipes), *lastShip(ship(_,_,'Corn',_,_),Shipes), *exists(ship(_,8,_,'Black',_),Shipes), *nextTo(ship(_,_,'Corn',_,_),ship(_,_,'Rice',_,_),Shipes), *exists(ship(_,6,_,_,'Hamburg'),Shipes), *exists(ship(PortSaidShip,_,_,_,'Port Said'),Shipes), *exists(ship(TeaCarrier,_,'Tea',_,_),Shipes).
所以你需要看懂四行代码才能理解你的问题!
正如其他人已经指出的那样,问题是一旦您使用 ship/6
而在其他情况下 ship/5
。
另一点:(_,_,_,A,B)
最好写成[_,_,_,A,B]
通用列表符号。
关于prolog - 为什么我无法用 Prolog 得到 Ship Puzzle 的答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30739878/
这是一个有点哲学问题。我正在为我的软件添加一个小功能,我认为大多数用户都会使用它,但他们使用该软件的次数可能只有 10%。换句话说,该软件没有它 3 个月就很好,但是有 4 或 5 个用户要求它,我同
我已经在我的网站上成功设置了 PayPal IPN,它运行良好。在我的 PayPal 帐户中,我设置了评估运费和税收计算的选项(仅限爱荷华州)。但唯一的问题是,在 PayPal 结帐页面上,它要求我手
我很乐意帮助解决我遇到的令人沮丧的问题。第一次设置 Spree,但我已经在 Rails 中开发了 3 年,所以我熟悉它的工作原理。 几乎是默认设置。但是当我尝试结帐时,单击“地址”页面上的“保存并继续
我想知道如何使用 eBay API 将“标准运输(FedEx Ground 或 FedEx Home Delivery®)”指定为运输服务。任何人都可以提供任何指示吗?所有示例仅使用“标准运输”选项。
我目前正在使用 Sharepoint 框架环境开发 Sharepoint WebPart。我目前正在使用功能区(添加按钮和下拉菜单),因此我必须在线部署 Web 部件,以便我可以测试功能区相关任务(工
我正在开发的其中一个网络应用程序有一个相当小的网络商店/购物车。由于客户公司实际位于加利福尼亚州并且在那里有实际位置,因此他们需要对运往加利福尼亚州的所有订单收取加利福尼亚州销售税。 对于那些不知道的
想象一下,您没有功能蔓延的问题,您有一个积极进取且稳定的团队,明确定义要解决的问题,并且您了解与项目相关的领域/语言/工具。 您如何坚持计划并完成 1.0 里程碑? 您对迭代运输的方法是什么? 我想特
有人知道Aramex Shipping服务及其API吗?我在他们的网站上找到了示例代码,并应用了我的API凭据,但出现错误。有人可以帮我整合吗? https://rsidemos.com/develo
我有一个客户想要电子商务网站,但他们必须提供定制运输服务。运输方式如下: 当在线客户下订单并显示发货页面时,此页面必须查询传递所有订单信息(以 JSON 形式)的自定义发货服务。运输服务将返回一个包含
如何获得包含 magento 中运费的数组/对象,例如统一费率、免费送货等? 与选择的地址或产品无关。 最佳答案 这是另一种方法。您需要设置邮政编码和国家/地区 - 即使这对您的运输方式并不重要。 /
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
在使用 Paypal API 创建付款时,是否有任何选项允许从结帐弹出窗口中删除“运送至”部分?我的意思是不要在弹出窗口中显示它。 我不使用shipping_address option创建付款配置时
前提是人 1 想通过大洋向人 2 发送 secret 消息 M(没有 key 共享)。她决定通过 3 艘船发送部分消息,如果任何两艘船的版本都被交付,人 2 就可以构建完整的原始消息。目标是使每个部分
我正在开发电子商务类型的 Web 应用程序,需要以某种方式处理运费计算。我发现的一些规则: 免费送货 满满免运费 特定地理区域内免费送货 统一运费 固定费率 + 每个产品的固定金额 不同的费率取决于运
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 3年前关闭。 Improve this questi
我尝试实现 fedex api 来计算从 wnn 到一个国家/地区的邮政编码的运输成本。它在美国工作得很好。它还可以从美国到其他国家/地区工作(已尝试在 IN 和 AU)。但是当我尝试使用来自印度或澳
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 2年前关闭。 Improve this qu
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我有一个超小型(没有数据,只有一些单列表,我只是在测试)本地 SQL Server 数据库,我正在尝试将其在线迁移到 SQL 托管实例。 据我所知,我已按应有的方式配置了所有内容 - 备份文件存在于文
当通过 Suitescript 在 NetSuite 中创建销售订单时,我们可以通过向其发送包含完整地址的字符串来成功设置“发货至”(字段 ID:shipaddress)。 这会导致问题,因为“SHI
我是一名优秀的程序员,十分优秀!