首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何删除Prolog中的重复事实

如何删除Prolog中的重复事实
EN

Stack Overflow用户
提问于 2013-10-03 17:56:58
回答 1查看 896关注 0票数 1

我正在用Prolog编写一个规则来创建一个事实,pit(x,y)。下面这个规则是我的主要函数的三次调用,它是插入三个凹坑,其中没有一个在(1,1)或(1,2)或(2,1),但问题是,有时两个坑有相同的x和y,其中x和y只能从1到4。(4x4栅格)

代码语言:javascript
运行
复制
placePit(_) :-   Px is random(4)+1,
                 Py is random(4)+1,
                 write(Px),
                 write(' '),
                 writeln(Py),
                 (Px =\= 1; 
                 Py =\= 1),
                 (Px =\= 1;
                 Py =\= 2),
                 (Px =\= 2;
                 Py =\= 1)
                 ->
                 pit(Px,Py);
                 placePit(4).

我不希望这种情况发生,所以我编写了另一条规则来检查两个坑是否是相同的第一个,然后扩展到从数据库中删除任何一个。据我所测试,它根本不会被解雇,即使两个坑似乎是相同的。我做错了什么?如何去除重复的事实?

代码语言:javascript
运行
复制
pit(A,B) :- pit(C,D), 
            A = C, 
            B = D, 
            write('Duplicate').

PS。我在Prolog是个新手。如有任何建议,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-03 19:10:16

也许这会有帮助,假设你实际上需要生成事实

代码语言:javascript
运行
复制
:- dynamic(pit/2).

pit(1,1).
pit(1,2).
pit(2,1).

placePit(N) :-
  N > 0,
  Px is random(4)+1,
  Py is random(4)+1,
  ( \+ pit(Px, Py)         % if not exist
  -> assertz(pit(Px, Py)), % store
     M is N-1              % generate another
  ;  M = N                 % nothing changed, retry
  ),
  placePit(M).             % recursion is the proper Prolog way to do cycles
placePit(0).               % end of recursion (we call it 'base case')

你应该打电话给

代码语言:javascript
运行
复制
?- placePit(3).

它显示了一些语法细节,比如Prolog中的‘if/ that /else’,它有一个特殊的形式。

编辑完成后,您可以删除不必要的凹坑/2,以获得您的数据库‘干净’。

代码语言:javascript
运行
复制
?- maplist(retract, [pit(1,1),pit(1,2),pit(2,1)]).

(请注意,根据您的描述,我假设DB存储pit/2对于进一步处理是有价值的)。

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

https://stackoverflow.com/questions/19165919

复制
相关文章

相似问题

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