我正在努力使用学校的序言来解决逻辑难题。线索如下:
-
布朗、克拉克、琼斯和史密斯是四位为他们的人民服务的重要公民
作为建筑师、银行家、医生和律师的社区,尽管不一定
分别。
布朗比琼斯更保守,但比史密斯更自由,
比比他年轻的人打高尔夫球更好,并且拥有
比克拉克年长的男性收入更高。
比建筑师挣得多的银行家也不是最年轻的
也不是最古老的。
医生的高尔夫球技术比律师差,但他不那么保守
比建筑师。
正如所预料的那样,最年长的人是最保守的,并且有
收入最高,最年轻的人是最好的高尔夫球手。
每个男人的职业是什么?
提示:根据财富、能力、相对年龄等对人们进行排名
使用数字 1,2,3,4 请注意说明 1 是否代表,
例如,最小的或最大的。这样做可以使比较更容易编码。
To code(如下)将线索给出的所有关系解释为列表的列表,其中每个列表定义
%[profession,surname,politics,relative_age, relative_salary, golf_ability]:
profession(L) :- L = [[_,'Brown',_,_,_,_],[_,'Jones',_,_,_,_],[_,'Clark',_,_,_,_],
[_,'Smith',_,_,_,_]],
member([_,'Brown',P1,A6,M3,G3],L),
member([_,'Jones',P2,_,_,_],L),
member([_,'Clark',_,A3,_,_],L),
member([_,'Smith',P3,_,_,_],L),
moreconservative(P1,P2),
moreliberal(P1,P3),
bettergolfer(G3,younger(_,A6)),
richer(M3,older(_,A3)),
member(['banker',_,_,A1,M1,_],L),
member(['architect',_,P5,_,M2,_],L),
richer(M1,M2),
(A1 = 2;A1 = 3),
member(['doctor',_,P4,_,_,G1],L),
member(['lawyer',_,_,_,_,G2],L),
worsegolfer(G1,G2),
moreliberal(P4,P5),
member([_,_,4,4,4,_],L),
member([_,_,_,1,_,4],L).
我像这样定义relative_politics、relative_salary、relative_age和golf_ability关系
EG:
richer(4,1).
moreconservative(4,1).
poorer(1,4).
poorer(1,3).
所有关系都会如此。
我想我已经忠实地将所有线索翻译成序言,但当我查询数据库时它只是说失败。例如:
?- profession(L).
fail.
我正在使用 NU Prolog。我想知道我是否在翻译线索时犯了错误,或者我遗漏了数据库满足列表 L 的所有条件所需的事实。