首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >排除prolog中的tuples_in列表

排除prolog中的tuples_in列表
EN

Stack Overflow用户
提问于 2015-07-03 18:14:17
回答 4查看 473关注 0票数 5

简而言之,这就是问题所在: 16名儿童将坐在4x4排的椅子上。这些儿童有8名女孩(编号1.8)和8名男孩(编号9.16)。1,3,5,8认为男孩是令人讨厌的9,10,11,14女孩是粗俗的--这些人是敌人:[1,2,4,6,4,7,4,9,11,12,14,14,16]

查找两个子级不是敌人的谓词定义为:

代码语言:javascript
运行
复制
not_enemy(A, B) :-
    NotA #\= A #\/ NotB #\= B,
    tuples_in([[NotA, NotB]],
              [[1,2], [4,6], [4,7], [4, 9],[9,11], [12, 14], [14,16]]).

以上代码被发现为这里

但是当我查询?- not_enemy(1,2)时,输出是真的。

我不得不使用这个长代码来代替:

代码语言:javascript
运行
复制
not_enemy(A, B) :-
          A #=1 #==> B #\= 2,
          A #=4 #==> B #\= 6,
          A #=4 #==> B #\= 7,
          A #=4 #==> B #\= 9,
          A #=9 #==> B #\= 11,
          A #=12 #==> B #\= 14,
          A #=14 #==> B #\= 16.

有人能帮忙纠正第一段代码吗?提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-25 07:41:41

我找到了另一个答案,而不是用这个

代码语言:javascript
运行
复制
not_enemy(A, B) :-
    NotA #\= A #\/ NotB #\= B,
    tuples_in([[NotA, NotB]],
              [[1,2], [4,6], [4,7], [4, 9],[9,11], [12, 14], [14,16]]).

用#否定tuples_in就行了

代码语言:javascript
运行
复制
not_enemy(A, B) :-
    #\ tuples_in([[A,B]],
                 [[1,2], [4,6], [4,7], [4, 9],[9,11], [12, 14], [14,16]]).
票数 3
EN

Stack Overflow用户

发布于 2015-07-03 21:49:25

我会改进你的代码,只是为了使它成为通用的

代码语言:javascript
运行
复制
not_enemy(A, B) :-
    maplist(not_enemy(A,B), [[1,2], [4,6], [4,7], [4,9], [9,11], [12,14], [14,16]]).
not_enemy(A,B,[X,Y]) :-
    X #= A #==> Y #\= B.

我找不到合适的方法来使用tuples_in来解决这个问题。

票数 6
EN

Stack Overflow用户

发布于 2015-07-03 22:10:25

以上使用tuples_in/2是错误的。

tuples_in视为定义“兼容性表”的一种方法:那么很明显,与(#\=)/2的组合不可能用于表示“不兼容表”。

为什么?因为--使用不兼容表--我们不想排除任何一个不兼容的元组,但是所有这些元组同时都是

当处理有限区域时,我们可以显式地构造一个相容表,方法是以笛卡尔积作为消除不相容对的基础。

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

https://stackoverflow.com/questions/31212357

复制
相关文章

相似问题

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