Аналогично мировым блокам в прологе с новыми правилами

Я поеду в путешествие и возьму своих питомцев, у меня 3 животных (собака, кошка, крыса), но они не очень хорошо ладят. Я могу взять только 1 животное за раз, но я не могу оставить собаку с кошкой или кошку с хомяком наедине, потому что они буквально съели бы друг друга, я ищу Пролог, чтобы найти мой результат действительных переходов, чтобы получить в мой новый дом с моими 3 животными. Я взял мир блоков Братко, так как каждый блок я могу интерпретировать как 1 животное, а 3 списка, которые возникают в исходной задаче, я вижу как [[old house], [who do I take?], [new house]], нужно было бы только добавить правила, что животные не должны быть вместе и что цель заканчивается в третьем списке. пример того, что я ищу, следующий...

-? решение4([[собака,кошка,крыса],[],[]],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]], меня волнует переход животных между каждым списком, чтобы они не дрались, когда я оставляю их одних.

другими словами...

Я новичок в программировании на прологе, у меня возник вопрос. Из мира блоков в книге Братко мне нужно расположить блоки СОБАКА КОТ КРЫСА, я просто не могу поставить КОШКУ с/поверх КРЫСЫ или наоборот, и >СОБАКА с/над КОШКОЙ или наоборот, и я могу проходить только блок за блоком, один за другим. У меня 3 места, результат упорядоченного списка должен быть на месте 3, примерно так: R = (ранее там все изменения, которые вы сделали, чтобы добраться до этого)... [[ ], [ ], [cat, крыса, собака]].

Это мой код...

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

person J.A.M.G.    schedule 14.11.2020    source источник
comment
Интересно: планирование Prolog с использованием retract и assert   -  person Guy Coder    schedule 14.11.2020
comment
Вы должны изменить [[ ], [ ], [Cat, Rat, Dog]] на [[ ], [ ], [cat, rat, dog]], так как кто-то может подумать, что вы пытаетесь использовать свой код с переменными, а не со значениями.   -  person Guy Coder    schedule 14.11.2020
comment
Где используется предикат verifica/2? Вы показываете код, но я не вижу вызова к нему. Вы дали нам весь код?   -  person Guy Coder    schedule 14.11.2020
comment
Можете ли вы дать описание того, как ваш код должен работать. Я понятия не имею, что означает invalido(dog,cat).. Значит ли это, что собака не может быть рядом с кошкой? Означает ли это, что собака и кошка не могут быть друг над другом?   -  person Guy Coder    schedule 14.11.2020
comment
Как я часто говорю другим, если утка этого не знает, то и я не знаю знаю это.   -  person Guy Coder    schedule 14.11.2020
comment
Вы правы, я уже изменил значения [dog,cat,rat], извините за это.   -  person J.A.M.G.    schedule 15.11.2020
comment
verifica / 2 состоит в том, чтобы увидеть, какие животные могут быть вместе или нет, в рекурсии с invalido, этот предикат я пытаюсь ввести в свой код и рекурсивно проверить списки комбинаций, которые он сделал, избегая, таким образом, наличия вместе животных, которые не берите друг друга, перемещая их в другой список (избегайте драки между животными).   -  person J.A.M.G.    schedule 15.11.2020
comment
То, что я пытаюсь сказать, это то, что invalido - это движения, которые я не могу выполнять в списках, и verifica, что животное будет с тем, что не носится, например -? verifica(Собака, X). Х = кот.   -  person J.A.M.G.    schedule 15.11.2020
comment
Спасибо за дополнительную информацию, но у меня до сих пор нет ясной картины. Если бы вы могли найти время, чтобы нарисовать картинки и опубликовать их в вопросе, это помогло бы.   -  person Guy Coder    schedule 15.11.2020
comment
Конечно, ждать...   -  person J.A.M.G.    schedule 15.11.2020
comment
спасибо за интерес Гай Кодер   -  person J.A.M.G.    schedule 15.11.2020