如何在Prolog中删除重复事实

如何在Prolog中删除重复事实,prolog,duplicates,fact,Prolog,Duplicates,Fact,我正在用Prolog编写一个规则来创建一个事实,pitx,y。下面的规则从我的主函数调用了三次,它插入了三个坑,其中没有一个位于1,1或1,2或2,1,但问题是有时两个坑具有相同的x和y,其中x和y只能从1到4。4x4格栅 placePit(_) :- Px is random(4)+1, Py is random(4)+1, write(Px), write(' '),

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

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).
我不希望发生这种情况,因此我先编写另一条规则来检查两个坑是否相同,然后将扩展以从数据库中删除其中一个坑。根据我的测试,即使两个坑看起来是一样的,它也不会被烧掉。我做错了什么?如何删除重复的事实

pit(A,B) :- pit(C,D), 
            A = C, 
            B = D, 
            write('Duplicate').

另外,我对Prolog很陌生。感谢您的任何建议。

假设您确实需要生成事实,那么这可能会有所帮助:

你应该打电话给我

?- placePit(3).
它显示了一些语法细节,比如“if/then/else”,在Prolog中有一种特殊的形式

编辑完成后,您可以删除不需要的坑/2,以使数据库“干净”

?- maplist(retract, [pit(1,1),pit(1,2),pit(2,1)]).

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

谢谢。它工作得很好,但是如何删除pit1,1、pit1,2和pit2,1。我不想要这三个也许我不够清楚。请参阅我的编辑。也许基于列表的解决方案会更好,但您的问题没有显示任何列表用法。。。然后我坚持使用数据库处理。
?- maplist(retract, [pit(1,1),pit(1,2),pit(2,1)]).