如何在Prolog中删除重复事实
我正在用Prolog编写一个规则来创建一个事实,pitx,y。下面的规则从我的主函数调用了三次,它插入了三个坑,其中没有一个位于1,1或1,2或2,1,但问题是有时两个坑具有相同的x和y,其中x和y只能从1到4。4x4格栅如何在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(' '),
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)]).