Prolog Swi序言双向子句/事实
我需要在Swi Prolog中描述以下事实的帮助: 克拉克和琼斯住在同一所房子里,一起下棋 及 经理和建筑师住在同一所房子里,没有其他员工住在那所房子里 我有一个这样的结构:Prolog Swi序言双向子句/事实,prolog,zebra-puzzle,Prolog,Zebra Puzzle,我需要在Swi Prolog中描述以下事实的帮助: 克拉克和琼斯住在同一所房子里,一起下棋 及 经理和建筑师住在同一所房子里,没有其他员工住在那所房子里 我有一个这样的结构: [个人(,,,,,…]) 其中person描述了以下内容: 人(姓名、职业) 我正在解决的难题包含了更多的事实,但我在描述这些双向事实时遇到了困难 为了简单起见,我把这个解决方案做成了函数式编程,我把所有的东西都分解成函数。我有一个名为fact1(List)的方法,它接受前面描述的结构(List ofperson结构) 我
[个人(,,,,,…])
其中person
描述了以下内容:
人(姓名、职业)
我正在解决的难题包含了更多的事实,但我在描述这些双向事实时遇到了困难
为了简单起见,我把这个解决方案做成了函数式编程,我把所有的东西都分解成函数。我有一个名为fact1(List)
的方法,它接受前面描述的结构(List ofperson
结构)
我怎么形容克拉克和琼斯住在同一所房子里
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?
↓ 更新↓
整个谜题如下(我知道它与上面的例子不匹配)
布朗、克拉克、琼斯和史密斯是在贝尔敦第一国民银行担任会计、出纳、经理和总裁的人的名字,尽管不一定分别担任
\+ 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的方式来记录事实。如果你告诉我们(在问题中)你的最终目标是什么,建议一个可行的解决方案会更容易。如果你搜索“爱因斯坦难题”或“斑马难题”,你可能会得到一些想法。这只是根据你的两个事实用英语表达的方式进行的猜测。嘿,鲍里斯!谢谢你的建议。我设法解决了这个难题,如果你感兴趣,你可以阅读更新后的原始帖子。