首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Prolog上编写代码?

如何在Prolog上编写代码?
EN

Stack Overflow用户
提问于 2013-03-14 14:07:50
回答 1查看 179关注 0票数 0

你能解释一下我该怎么做才能在Prolog上编写代码吗?

梅森,亚历克斯,史蒂夫和西蒙站在警方的阵容中。其中一个是金发,英俊,没有伤痕。其中两个不是金发的人站在梅森的两边。亚历克斯是唯一站在一个英俊男人旁边的人。史蒂夫是唯一一个没有站在一个伤痕累累的人旁边的人。谁是金发,英俊,不怕?

我这里有,

P --> standing(x,y)

twoOfThem(不是金发,站在梅森的两侧)

代码语言:javascript
运行
复制
standing(mason,[x,y]):-
         blond([x,y]) == false.

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

代码语言:javascript
运行
复制
standing(alex,x):-
         handsome(x).

史蒂夫只是不是站在没有伤痕的旁边。

代码语言:javascript
运行
复制
standing(steve,x):- 
         unscared(x).
EN

回答 1

Stack Overflow用户

发布于 2013-03-15 00:00:04

在不使用CLP(FD)的情况下,您应该使用Prolog的组合能力以适当的方式表达问题和约束。例如

代码语言:javascript
运行
复制
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
       ]),
...

每个变量(以大写字母开头的符号!)是person的属性,并且可以采用来自域的值。yn/1这是一个服务事实,允许这些二进制值假设为是或否:

代码语言:javascript
运行
复制
yn(y).
yn(n).

然后可以用这种方式来表达约束(这里只是第一个)

代码语言:javascript
运行
复制
...
   % 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),
...

而解决方案将是

代码语言:javascript
运行
复制
   % One of them is blond, handsome, and unscarred.
   member([Name,  _, y, y, y], L).

我不确定我能理解所有的约束(用英语),确实我的程序找不到解决方案。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15402350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档