如何在Prolog上编写此代码?

如何在Prolog上编写此代码?,prolog,zebra-puzzle,Prolog,Zebra Puzzle,请你解释一下我将如何在Prolog上编写这个东西 梅森,亚历克斯,史蒂夫, 西蒙站在警察队伍中。其中一个金发碧眼,英俊潇洒,毫无头饰。两个 其中一个不是金发的站在梅森的两边。亚历克斯是唯一站着的人 正好挨着一个帅哥。史蒂夫是唯一一个没有站在伤疤旁边的人 伙计。谁是金发,英俊,不害怕 我在这里 p-->站立(x,y) 其中两人(不是金发,站在梅森的两边) 亚历克斯只有一个站在一个帅哥旁边 standing(alex,x):- handsome(x). 史蒂夫只是没有站在无纹身的

请你解释一下我将如何在Prolog上编写这个东西

梅森,亚历克斯,史蒂夫, 西蒙站在警察队伍中。其中一个金发碧眼,英俊潇洒,毫无头饰。两个 其中一个不是金发的站在梅森的两边。亚历克斯是唯一站着的人 正好挨着一个帅哥。史蒂夫是唯一一个没有站在伤疤旁边的人 伙计。谁是金发,英俊,不害怕

我在这里

p-->站立(x,y)

其中两人(不是金发,站在梅森的两边)

亚历克斯只有一个站在一个帅哥旁边

standing(alex,x):-
         handsome(x).
史蒂夫只是没有站在无纹身的旁边

standing(steve,x):- 
         unscared(x).
在不使用CLP(FD)的情况下,您应该使用Prolog的组合功能以适当的方式表达问题和约束。比如说

puzzle(Name) :-

    L = [[mason, Pos1, Blond1, Handsome1, UnScared1],
         [alex,  Pos2, Blond2, Handsome2, UnScared2],
         [steve, Pos3, Blond3, Handsome3, UnScared3],
         [simon, Pos4, Blond4, Handsome4, UnScared4]
        ],

   permutation([1,2,3,4], [Pos1,Pos2,Pos3,Pos4]),
   maplist(yn,
       [Blond1, Handsome1, UnScared1,
        Blond2, Handsome2, UnScared2,
        Blond3, Handsome3, UnScared3,
        Blond4, Handsome4, UnScared4
       ]),
...
每个变量(以大写字母开头的符号!)都是一个人的属性,可以从域中获取一个值。yn/1这是一个服务事实,允许这些二进制值假定为是或否:

yn(y).
yn(n).
然后可以用这种方式表示约束(这里仅是第一种)

我不确定我是否理解每一个约束(英语),事实上我的程序没有找到解决方案


这个程序相当慢,需要CLP(FD)。如果您对CLP(FD)解决方案感兴趣,请编辑您的问题(例如,添加适当的标签)。

您尝试过什么?请向我们展示您的努力(我们应该在meta上发布一个请求,在标记的序言答案上添加此注释的上下文…)您有一个事实列表。您的第一步应该是尝试将这些事实放入Prolog语法中(以建立一个“数据库”)。然后,开始思考这些事实(以谓词表示)之间的关系。
yn(y).
yn(n).
...
   % Two of them who are not blond are standing on either side of Mason.
   member([mason, I1, _,_,_], L),
   member([_,     I2, n,_,_], L),
   member([_,     I3, n,_,_], L),

   (I2>I1, I3>I1 ; I2<I1, I3<I1),
...
   % One of them is blond, handsome, and unscarred.
   member([Name,  _, y, y, y], L).