搜索时,Prolog会给出正确的答案,但在搜索另一个

时间:2017-09-29 05:34:54

标签: search prolog boolean-logic

好的所以我有这个Prolog代码代表了一个不断发展的积木世界,并且有一个机器人手臂可以移动1个街区,还有2个小机器人“抢劫和钻孔”可以绘制他们分配的块块在塔顶或塔底时的颜色(参见条件代码)。当块X位于塔顶时,函数clear(X)为真,当X在塔上时(塔底),ontable(X)为真。单块塔将clearontable作为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个小时试图解决这个问题,因为它不会让我检查我是否得到了所有正确答案或缺少某些东西。你们弄清楚发生了什么事吗? 试图让一切尽可能清楚,但如果你需要我澄清一些事情,请发表评论!

1 个答案:

答案 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)).

对我的队友巴勃罗的信任。