Prolog Swi序言双向子句/事实

Prolog Swi序言双向子句/事实,prolog,zebra-puzzle,Prolog,Zebra Puzzle,我需要在Swi Prolog中描述以下事实的帮助: 克拉克和琼斯住在同一所房子里,一起下棋 及 经理和建筑师住在同一所房子里,没有其他员工住在那所房子里 我有一个这样的结构: [个人(,,,,,…]) 其中person描述了以下内容: 人(姓名、职业) 我正在解决的难题包含了更多的事实,但我在描述这些双向事实时遇到了困难 为了简单起见,我把这个解决方案做成了函数式编程,我把所有的东西都分解成函数。我有一个名为fact1(List)的方法,它接受前面描述的结构(List ofperson结构) 我

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

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

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

我有一个这样的结构:

[个人(,,,,,…])

其中
person
描述了以下内容:

人(姓名、职业)

我正在解决的难题包含了更多的事实,但我在描述这些双向事实时遇到了困难

为了简单起见,我把这个解决方案做成了函数式编程,我把所有的东西都分解成函数。我有一个名为
fact1(List)
的方法,它接受前面描述的结构(List of
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?

↓ 更新↓ 整个谜题如下(我知道它与上面的例子不匹配)

布朗、克拉克、琼斯和史密斯是在贝尔敦第一国民银行担任会计、出纳、经理和总裁的人的名字,尽管不一定分别担任

  • 尽管出纳员总是打败他,但总统不会和其他人下棋

  • 经理和出纳都是比会计更好的棋手

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

  • 克拉克下棋比琼斯好

  • 会计住在总裁附近,但不住在其他人附近

  • 在一位朋友的帮助下,我提前做了一些逻辑任务,成功地解决了这个问题

    我将事实1、3和5结合起来,得出以下事实:

    收银员只和总统玩

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

    会计和总裁住在一起

    结论:琼斯和史密斯既不是总裁也不是出纳员,因为他们一起生活和玩耍,但总裁和会计住在一起,只和出纳员玩耍

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

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

    不一定能理解,但是。。。如果您想选择一个普通的房子,我想您应该在person结构中添加一个house字段(您的示例只包含姓名和职业)

    如果您的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/1
    编写为

    fact1(L) :-
      getHouse(L, clarke, CommonHouse),
      getHouse(L, jones, CommonHouse).
    

    我真的不需要知道那个人的房子。目标是找出哪个名字与哪个职业相匹配。只有这样的事实,谁和谁住在一起,谁不和谁住在一起,才能减少数据集。我想在这种情况下,没有必要添加house字段?这不是一个坏的开始,但可能有一种更像Prolog的方式来记录事实。如果你告诉我们(在问题中)你的最终目标是什么,建议一个可行的解决方案会更容易。如果你搜索“爱因斯坦难题”或“斑马难题”,你可能会得到一些想法。这只是根据你的两个事实用英语表达的方式进行的猜测。嘿,鲍里斯!谢谢你的建议。我设法解决了这个难题,如果你感兴趣,你可以阅读更新后的原始帖子。