用 prolog 解决 Caliban 问题

问题描述 投票:0回答:2

我正在学校使用 prolog 解决逻辑难题。线索如下:

  1. 布朗、克拉克、琼斯和史密斯是 4 位为他们的人民服务的重要公民 作为建筑师、银行家、医生和律师的社区,尽管不一定 分别。

    布朗,比琼斯更保守,但比史密斯更自由, 比比他年轻的人打高尔夫球更好,并且拥有 比克拉克年长的男性收入更高。

    收入比建筑师高的银行家也不是最年轻的 也不是最古老的。

    医生的高尔夫球技术比律师差,但他不那么保守 比建筑师。

    正如所预料的那样,最年长的男人是最保守的,并且有 收入最高,最年轻的人是最好的高尔夫球手。

    每个人的职业是什么?

    提示:根据财富、能力、相对年龄等对人们进行排名 使用数字 1,2,3,4 请注意说明 1 是否代表, 例如,最小的或最大的。这样做可以使比较更容易编码。

代码(如下)将线索给出的所有关系解释为列表的列表,其中每个列表定义

 %[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 的所有条件所需的事实。

prolog logic relation zebra-puzzle
2个回答
1
投票

bettergolfer(G3,younger(_,A6))
...在 Prolog 中,这种方式是行不通的。相反,有这个

   (  member( X,L), age(X,AX), golf(X,GX),
      (  younger(AX,A6) -> better_golfer(G3,GX) ; true )),
   .....

age( [_,_,_,A,_,_],A).
golf([_,_,_,_,_,G],G).
.....

这意味着,所有比布朗年轻的人(包括没有人)的高尔夫球手一定比他差。

这里也有一个问题。既然我们被告知比布朗年轻的人,这意味着必须存在“至少一个”这样的人(与数学“蕴涵的定义”不同)。我们也必须对此进行编码。例如, ( member(X,L), age(X,AX), younger(AX,A6) -> true ), ..... (当然为新的日志变量使用唯一的名称)。您必须对您的

richer(M3,older(_,A3))

进行相同的转换。

顺便说一句,好主意,以生成方式定义比较谓词:
poorer(1,2). poorer(1,3). poorer(1,4). poorer(2,3). poorer(2,4). poorer(3,4). richer(A,B):- poorer(B,A)

如果您将它们定义为算术比较,

poorer(A,B):- A<B.
,您可能会遇到未实例化变量的问题(正如最近
在这里讨论的那样

)。

    
这个问题提出得不好。人们必须空洞地接受陈述为真,就像“这个房间里所有的白兔子都是黑的。”,这在大多数房间都是正确的。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.