我需要帮助在 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>
整个拼图如下(我知道它与上面的示例不匹配)。
布朗、克拉克、琼斯和史密斯是贝尔敦第一国民银行的会计师、出纳员、经理和行长,但不一定分别担任这些职务的人的名字。
尽管收银员一直在击败他,但总统将不会与其他人下棋。
经理和收银员都是比会计更好的棋手。
琼斯和史密斯是隔壁邻居,晚上经常一起下棋。
克拉克的国际象棋比琼斯好。
会计师住在总统附近,但不靠近任何其他人。
在朋友的帮助下,我设法通过预先执行一些逻辑任务来解决它。
我结合事实一、三和五,得到以下事实:
收银员只和总统玩。
琼斯和史密斯住在一起,一起玩耍。
会计师与总裁同住。
结论:琼斯和史密斯既不能当总裁也不能当收银员,因为他们住在一起玩,但总裁和会计住在一起,只和收银员一起玩。
然后我添加了以下限制,然后我得到了一个确定性的单一答案:
\+ member(person(jones, accountant), Persons)
\+ member(person(smith, accountant), Persons)
\+ member(person(jones, president), Persons)
\+ member(person(smith, president), Persons)