1

我会去旅行,带上我的宠物,我有 3 只动物(狗、猫、老鼠),但它们相处得不太好。我一次只能带一只动物,但我不能让狗和猫或猫和仓鼠单独在一起,因为它们实际上会互相吃掉,我正在寻找 Prolog 来找到我的有效转换结果以获得带着我的 3 只动物到我的新房子。我采用了 Bratko 的积木世界,因为我可以将每个积木解释为 1 个动物,而我可以将原始问题提出的 3 个列表视为[[old house], [who do I take?], [new house]],只需要添加动物不应该在一起的规则和目标在第三个列表中结束。我正在寻找的一个例子如下......

-?solucion4([[狗,猫,老鼠],[],[]],X)。

X = [[dog,cat,rat],[],[]], %%%this is my start
       [[dog,rat],[cat],[]],
       [[dog],[rat],[cat]],
       [[dog],[cat],[rat]],
       [[cat],[dog],[rat]],
      [[],[cat],[rat,dog]],
      [[],[],[rat,dog,cat]], %%% this is my goal

我不关心列表 3 的顺序[[], [], [new house]],我关心动物在每个列表之间的过渡,这样当我不理会它们时它们就不会打架。

换句话说……

我是prolog编程的初学者,我有一个问题。从 Bratko 书中的块世界,我需要安排“块” DOG CAT RAT,我不能将 CAT 与/over RAT或反之亦然,以及DOG 与/over CAT,反之亦然,我只能一个接一个地通过。我有 3 个位置,“有序”列表的结果应该在 3 个位置,如下所示:R =(以前您为此所做的所有更改)... [[ ], [ ], [猫,老鼠,狗]]。

这是我的代码...

s(Pilas, [Pila1, [Tope1|Pila2] | OtrasPilas ]) :-
    quitar([Tope1|Pila1], Pilas, Pilas1),
    quitar(Pila2, Pilas1, OtrasPilas).

quitar(X, [X|Ys], Ys).
quitar(X, [Y|Ys], [Y|Ys1]) :-
    quitar(X,Ys,Ys1).

meta(Estado) :-
    member([rat,dog,cat],Estado). % Here I need any order but in list 3

我的限制是......

invalido(dog,cat).
invalido(cat,dog).
invalido(cat,rat).
invalido(rat,cat).

verifica(Animal,NO_Llevar):-
  invalido(Animal,Este_no),
  NO_Llevar = Este_no.

和我的搜索算法

camino(Nodo,Nodo,[Nodo]).
camino(PrimerNodo,UltimoNodo,[UltimoNodo|Camino]) :-
    camino(PrimerNodo,MenosElUltimo,Camino),
    s(MenosElUltimo,UltimoNodo),
    \+ member(UltimoNodo,Camino).

solucion4(NodoInicial,Sol) :-
    camino(NodoInicial,NodoMeta,Sol),
    meta(NodoMeta).
4

0 回答 0