我正在用Prolog编写一个规则来创建一个事实,pit(x,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').PS。我在Prolog是个新手。如有任何建议,将不胜感激。
发布于 2013-10-03 19:10:16
也许这会有帮助,假设你实际上需要生成事实
:- 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')你应该打电话给
?- placePit(3).它显示了一些语法细节,比如Prolog中的‘if/ that /else’,它有一个特殊的形式。
编辑完成后,您可以删除不必要的凹坑/2,以获得您的数据库‘干净’。
?- maplist(retract, [pit(1,1),pit(1,2),pit(2,1)]).(请注意,根据您的描述,我假设DB存储pit/2对于进一步处理是有价值的)。
https://stackoverflow.com/questions/19165919
复制相似问题