1

我需要帮助在 Swi-Prolog 中描述以下事实:

克拉克和琼斯住在同一所房子里,一起下棋。

经理和建筑师住在同一栋房子里,没有其他员工住在那栋房子里。

我有这样的结构:

[person(_, _), person(_, _), ...]

其中person描述了以下内容:

person(Name, Occupation)

我正在解决的难题包含更多的事实,但我无法描述这些双向事实。

为了简单起见,我使解决方案非常类似于函数式编程,我将所有内容拆分为函数。我有一个名为 的方法fact1(List),它接受前面描述的结构(person结构列表)。

我如何形容克拉克和琼斯住在同一所房子里?

name(clark).
name(jones).

name(person(Name, _), Name).
occupation(person(_, Occupation), Occupation).

fact1(List):-
   name(Clark, clark),
   name(Jones, jones),
   ???. % have references to Clark and Jones, but what now?

 

 

↓ 更新 ↓</h2>

整个拼图如下(我知道它与上面的示例不匹配)。

布朗、克拉克、琼斯和史密斯是贝尔敦第一国民银行的会计师、出纳员、经理和行长,但不一定分别担任这些职务的人的名字。

  1. 尽管收银员一直在击败他,但总统将不会与其他人下棋。

  2. 经理和收银员都是比会计更好的棋手。

  3. 琼斯和史密斯是隔壁邻居,晚上经常一起下棋。

  4. 克拉克的国际象棋比琼斯好。

  5. 会计师住在总统附近,但不靠近任何其他人。

在朋友的帮助下,我设法通过预先执行一些逻辑任务来解决它。

我结合事实一、三和五,得到以下事实:

收银员只和总统玩。

琼斯和史密斯住在一起,一起玩耍。

会计师与总裁同住。

结论:琼斯和史密斯既不能当总裁也不能当收银员,因为他们住在一起玩,但总裁和会计住在一起,只和收银员一起玩。

然后我添加了以下限制,然后我得到了一个确定性的单一答案:

\+ member(person(jones, accountant), Persons)
\+ member(person(smith, accountant), Persons)
\+ member(person(jones, president), Persons)
\+ member(person(smith, president), Persons)
4

1 回答 1

1

不确定但......如果你想选择一个普通的房子,我想你应该在你的个人结构中添加一个房子字段(你的例子只包含姓名和职业)。

如果你的 person 结构是

 person(Name, Occupation, House)

如果你想检查有名字的jones人和 clarke是否共享同一所房子并假设你必须检查一个列表person,我建议创建一个子句getHouse/3如下

getHouse([person(Name, _, House) | _], Name, House).

getHouse([_ | T], Name, House) :-
  getHouse(T, Name, House).

从人员列表中提取给定名称的房屋(或给定房屋的名称)。

使用getHouse/3,我想你可以写你的fact1/1as

fact1(L) :-
  getHouse(L, clarke, CommonHouse),
  getHouse(L, jones, CommonHouse).
于 2016-10-06T00:44:42.710 回答