【发布时间】:2017-12-21 15:01:13
【问题描述】:
谜题是这样的:一个岛上有 4 座寺庙。每个寺庙都有一个名称、位置和建造日期。您将获得 4 条线索来帮助您确定哪 4 种组合(姓名、位置、日期)是正确的。我必须使用 prolog 来解决这个问题。
寺庙的名称是:hori_takesi、okabe honzo、sama takako 和 takahashi。地点是:船内,toyagi,uchida和usui。日期是 1525、1585、1645 和 1705。
给你以下线索:
- 内田神社和建于1645年的寺庙中,一位是大人 takako,另一个是okabe honzo。
- 船内寺建于高桥之前
- toyagi 寺比臼井寺早 120 年建成
- Hori Takesi wasa 在 sama takako 之后建造
我创建了以下包含所有可能组合的知识库。
temple(hori_takesi, Location, Y).
temple(okabe_honzo, Location, Y).
temple(sama_takako, Location, Y).
temple(takahashi, Location, Y).
temple(Name, funai, Y).
temple(Name, toyagi, Y).
temple(Name, uchida, Y).
temple(Name, usui, Y).
temple(Shrine, Location, 1525).
temple(Shrine, Location, 1585).
temple(Shrine, Location, 1645).
temple(Shrine, Location, 1705).
你要问 prolog 的查询是:?-solution(X)。这必须返回所有 4 个正确的组合。所以 X 是 4 个元素的列表,即太阳穴。
解决方案(X)。如果所有线索都为真,则为真。所以我做了以下事情:
clue1(X) :- temple(Name, uchida, Y), Y\= 1645
clue2(X) :- temple(Name, funai, Y), temple(Shrine, takahashi, Y1), Y < Y1.
clue3(X) :- temple(Name, toyagi Y), temple(Shrine, usui, Y1). Y1 is Y + 120.
clue4(X) :- temple(hori_takesi, Loc, Y), temple(sama_takako, Loc, Y1) Y > Y1.
solution(X) :- clue1(X), clue2(X), clue3(X), clue4(X).
我不确定如何从这里继续前进。我得到的另一个提示是使用 member/2。但我不确定如何实现它。如果有人可以帮助我,我会很高兴。
【问题讨论】:
-
你应该使用 clpfd 库来解决这个问题
-
@damianodamiano:在学习高级工具之前,更好的OP学习基础知识。 CLP(FD) 它是一个leaking abstraction,你不能在不知道你的谓词发生了什么的情况下使用它......
-
在问题标题中,您指出了尝试中缺少的基本细节。您应该使用单个谓词对 grid 建模,其中变量有机会一起发挥作用。每条线索都适用于网格行的某个子集,因为每一行都代表一个实体。
标签: prolog zebra-puzzle