好的所以我有这个Prolog代码代表了一个不断发展的积木世界,并且有一个机器人手臂可以移动1个街区,还有2个小机器人“抢劫和钻孔”可以绘制他们分配的块块在塔顶或塔底时的颜色(参见条件代码)。当块X位于塔顶时,函数clear(X)
为真,当X在塔上时(塔底),ontable(X)
为真。单块塔将clear
和ontable
作为true
返回。
该代码旨在逐步提供所有解决方案,当被要求特定状态时(如同单个塔上的所有4个区块和红色涂漆)。
为此,定义了一系列动作和事实,它们的调节效果(当动作A在条件C下完成时,事实F发生了什么)和使用函数poss
进行可能性/现实检查(如果有的话,则返回true)行动是可行的)和holds
(如果某些事实为真,则返回true)适用于每个州S. legal
是这两者的混合(如果其中的所有内容都成立则是合法的,并且是可能的)。
%% Object Declaration (problem-specific)
block(B) :- member(B,[a,b,c,d]).
% colors available for rob and bor
color(rob,B) :- member(B,[blue]).
color(bor,B) :- member(B,[red]).
%% Initial Situation (problem-specific)
holds(F,s0) :- member(F,[on(a,b),on(b,c),ontable(c), ontable(d), clear(a), clear(d)]).
holds(color(B,white),s0) :- block(B).
%% Blocks World Preconditions (domain-specific)
%% action move_to_block(X,Z) moves block X on top of block Z
% poss is true when its possible to do the action.
poss(move_to_block(X,Z),S) :-
holds(clear(X),S), holds(clear(Z),S), Z\=X, \+ holds(on(X,Z),S).
poss(move_to_table(X),S) :-
holds(clear(X),S), \+ holds(ontable(X),S).
%% Robot R paints block B of color C
poss(paint(rob,B,C),S) :-
color(rob,C),holds(clear(B),S), \+ holds(color(B,C),S).
poss(paint(bor,B,C),S) :-
color(bor,C), holds(ontable(B),S), \+ holds(color(B,C),S).
%% Blocks World Effects (domain-specific)
% is_conditional_negative_effect(Act,Cond,Fact)
% when Act is peformed and Cond holds, Fact becomes false
is_conditional_negative_effect(move_to_block(X,_),on(X,Y),on(X,Y)).
is_conditional_negative_effect(move_to_block(X,_),ontable(X),ontable(X))
is_conditional_negative_effect(move_to_block(X,Z),true,clear(Z)).
is_conditional_negative_effect(move_to_table(X),on(X,_),on(X,_)).
is_conditional_negative_effect(paint(R,B,C),color(B,D),color(B,D)).
% is_conditional_positive_effect(Act,Cond,Fact)
% when Act is peformed and Cond holds, Fact becomes true
is_conditional_positive_effect(move_to_block(X,_),on(X,Y),clear(Y)).
is_conditional_positive_effect(move_to_block(X,Z),true ,on(X,Z)).
is_conditional_positive_effect(move_to_block(X,_),true,clear(X)).
is_conditional_positive_effect(move_to_table(X),true ,ontable(X)).
is_conditional_positive_effect(move_to_table(X),on(X,Y),clear(Y)).
is_conditional_positive_effect(move_to_table(X),true,clear(X)).
is_conditional_positive_effect(paint(R,B,C),color(B,_),color(B,C)).
holds(true,s0). % "true" always holds
holds(F,do(A,S)) :-
holds(F,S),
\+ (is_conditional_negative_effect(A,C,F), holds(C,S)).
holds(F,do(A,S)) :-
is_conditional_positive_effect(A,C,F),holds(C,S).
% S is legal if it is the result of performing executable actions
legal(s0).
legal(do(A,S)) :-
legal(S),
poss(A,S).
所以,当一个像下面这样的咨询时(time()
只会使给定的答案返回处理时间,为了优化起见...这是我稍后会检查的另一个问题):
time((legal(S), holds(on(b,d),S), holds(on(c,b),S), holds(on(a,c),S), holds(color(b,blue),S), holds(color(a,red),S))).
到目前为止,我得到了正确的答案,但在它给出另一个之前重复了10次,(也是正确的),所以如果我想要所有的答案,我必须粉碎;像一万次。我已经花了大约3个小时试图解决这个问题,因为它不会让我检查我是否得到了所有正确答案或缺少某些东西。你们弄清楚发生了什么事吗? 试图让一切尽可能清楚,但如果你需要我澄清一些事情,请发表评论!
答案 0 :(得分:0)
最后,我和朋友设法解决了问题,问题在于积极的条件效应,特别是与clear
相关的条件效应。这些肯定是显而易见的,因为在移动之前块必须已经返回clear
:
is_conditional_positive_effect(move_to_block(X,_),true,clear(X)).
is_conditional_positive_effect(move_to_table(X),true,clear(X)).
此外,我将一些条件更改为更具体,这些大大提高了搜索的性能:
is_conditional_negative_effect(move_to_table(X),on(X,_),on(X,_)).
被
取代is_conditional_negative_effect(move_to_table(X),on(X,Y),on(X,Y)).
和
is_conditional_positive_effect(paint(R,B,C),color(B,_),color(B,C)).
被
取代is_conditional_positive_effect(paint(R,B,C),true,color(B,C)).
对我的队友巴勃罗的信任。