2011-09-12 35 views
1

我遇到以下问题:桌子上有一些用立方体建造的塔。在Prolog中将立方体从位置A移动到位置

 a 
     b d 
     c e 
------------------- <- table 

现在我想立方体移动到另一种情况,像这样的:

 c e 
     a b d 
------------------- 

的Prolog程序应该打印步骤获得这种情况,例如:move cube a onto the table,等等。我在序言代表的第一种情况:

clean(t). % t is the table, you can always put things there 
clean(X) :- \+ on(_,X). % X is the top element, if there is nothing above it 

on(a,b). % a is on b 
on(b,c). % b on c 
on(d,e). % d on e 
on(c,t). % c on the table 
on(e,t). % and e on the table 

现在我的问题是找到一个解决方案,以Prolog的打印步骤,新的形势。我的第一个问题是,如何告诉Prolog新形势如何。我尝试了一些清单,但直到现在我还没有成功。

有没有人有一个想法如何解决这个问题?

+0

我想你可能需要陈述其他事实,可能像nextTo(a,b)? –

+0

nextTo是什么意思?左还是右?或以上? – Tobias

+0

我在说如果你没有额外的事实,你可能无法做出prolog打印你的新情况。我的意思是左和右,但如果这对你来说模棱两可,请尝试使用另一个标识符名称。 –

回答

1

如果您通过在数据库中的on/2谓词的事实编码问题的状态,那么你只能使用assertretract更改数据库更改状态(和你的谓词可能必须声明dynamic以及) 。这很笨拙。一个更好的解决方案是将问题状态作为参数传递给您的求解谓词(也可以隐藏包装谓词后面的结构)。对于回溯,这可能会更好,因此您可能需要实施搜索解决方案。

+0

你能告诉我一个例子吗? – Tobias

相关问题