我有以下问题:在桌子上有一些用立方体构建的塔。
a
b d
c e
------------------- <- table
现在我想将立方体移动到另一种情况,例如:
c e
a b d
-------------------
Prolog程序应该打印出这种情况的步骤,例如:move cube a onto the table
,等等。我有第一个在Prolog中表示的情况:
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 :(得分:1)
如果通过在数据库中包含on/2
谓词的事实来对问题状态进行编码,则只能使用assert
和retract
来更改数据库(以及您的谓词可能也必须声明为dynamic
。这很笨重。一个更好的解决方案是将问题状态作为参数传递给解决谓词(并且可能隐藏包装谓词后面的结构)。对于您可能需要实现搜索解决方案的回溯,这可以更好地工作。