首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Prolog分类

Prolog分类
EN

Stack Overflow用户
提问于 2016-01-13 04:14:32
回答 1查看 808关注 0票数 0

我正在开发一个关于寻找动物的prolog游戏。用户将一只动物保存在脑海中,回答游戏中的问题,AI正在试图找到这只动物。

我的问题是要把动物分类:

代码语言:javascript
运行
复制
mammal    :- verify(gives_milk), !.
bird      :- verify(has_feathers), !.

我想把这两门课分开。如果动物是哺乳动物,人工智能就不会问"has_feathers“。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-13 09:12:30

我不太明白您将如何质疑动物是否是mammal:您将需要该动物的论证。因此,谓词看起来应该是:

代码语言:javascript
运行
复制
mammal(A) :-
    verify(A,gives_milk),
    !.

显然,它有某种数据库,例如:

代码语言:javascript
运行
复制
verify(cow,gives_milk).
verify(crow,has_feathers).
% ...

接下来,您可以使用Prolog \+中的否定来确定动物没有羽毛:

代码语言:javascript
运行
复制
mammal(A) :-
    verify(A,gives_milk),
    \+ verify(A,has_feathers),
    !.

bird 不重用,反之亦然,因为这样就可以创建无限循环(除非允许表化支持)。

更具声明性的风格

更多的声明性风格可能是指定哪些方面应该保持,哪些不能保持。类似于:

代码语言:javascript
运行
复制
verifies(A,Pos,Neg) :-
    verify_pos(A,Pos),
    verify_neg(A,Neg).

verify_pos(_,[]).
verify_pos(A,[H|T]) :-
    verify(A,H),
    verify_pos(A,T).

verify_neg(_,[]).
verify_neg(A,[H|T]) :-
    \+ verify(A,H),
    verify_neg(A,T).

例如,现在您可以声明:

代码语言:javascript
运行
复制
mammal(A) :-
    verifies(A,[gives_milk],[has_feathers,produces_eggs]).

等。

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

https://stackoverflow.com/questions/34758304

复制
相关文章

相似问题

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