Создание списка Domino - PullRequest
       4

Создание списка Domino

0 голосов
/ 21 декабря 2018

Я пытаюсь получить отсортированный список Domino со списком Domino

Мой код в настоящее время выглядит так:

listdomino(_,[],[],[]).    
listdomino([I,J],M,Start,Fin):-
    (( member([J,K],M),
       delete(M,[J,K],M2),
       append([[J,K]],Fin1,Fin),
       listdomino([I,K],M2,Start,Fin1)
     )
   ;
    ( member([K,I],M),
      delete(M,[K,I],M2),
      append(Start1,[[K,I]],Start),
      listdomino([K,J],M2,Start1,Fin)
    )
   ).

listdominoSorted(X,M,Out):-
    append(Start,[X],K),
    append(K,Fin,Out),
    listdomino(X,M,Start,Fin).

Фактический результат:

?- listdominoSorted([1,2],[[2,1],[2,2]],L).
L = [[1, 2], [2, 2], [2, 1]] ;
L = [[2, 1], [1, 2], [2, 2]] ;
L = [[2, 1], [1, 2], [2, 2]] ;
L = [[2, 2], [2, 1], [1, 2]] ;

Программа дважды возвращает [[2, 1], [1, 2], [2, 2]] и после этого не завершает работу.

Желаемый результат:

?- listdominoSorted([1,2],[[2,1],[2,2]],L).
L = [[1, 2], [2, 2], [2, 1]] ;
L = [[2, 1], [1, 2], [2, 2]] ;
L = [[2, 2], [2, 1], [1, 2]] ;
false

Как решить эту проблему?

1 Ответ

0 голосов
/ 21 декабря 2018

Я просматривал ваш код в течение минуты или двух, но, увидев использование delete / 3 , прозвучали предупреждающие сигналы, и я посмотрел на другие примеры.Хотя этот связанный ответ не отвечает на ваш вопрос, утверждение

я предлагаю вместо этого провести быструю проверку на достоверность и позволить Прологу проработать точки вставки.

привел меня к попытке создать и протестировать методологию , для которой хорошо подходит Prolog.

Первая часть теста:

Домино недопустимо.

domino_test([]).

Действует одно домино.

domino_test([[_,_]]).

Когда два домино имеют одинаковое количество (D_1), они действительны.Это рекурсивно допустимо.

domino_test([[_,D_1],[D_1,D_2]|T]) :-
  domino_test([[D_1,D_2]|T]).

Далее для генерации значений.Это действительно просто перестановка домино.

?- permutation([[1,2],[2,1],[2,2]],P).
P = [[1, 2], [2, 1], [2, 2]] ;
P = [[1, 2], [2, 2], [2, 1]] ;
P = [[2, 1], [1, 2], [2, 2]] ;
P = [[2, 1], [2, 2], [1, 2]] ;
P = [[2, 2], [1, 2], [2, 1]] ;
P = [[2, 2], [2, 1], [1, 2]] ;
false.

Помещение перестановки с тестом в один предикат дает:

list_domino(L,P) :-
  permutation(L,P),
  domino_test(P).

Весь код

domino_test([]).

domino_test([[_,_]]).

domino_test([[_,D_1],[D_1,D_2]|T]) :-
  domino_test([[D_1,D_2]|T]).

list_domino(L,P) :-
  permutation(L,P),
  domino_test(P).

Пример:

?- list_domino([[1,2],[2,1],[2,2]],P).
P = [[1, 2], [2, 2], [2, 1]] ;
P = [[2, 1], [1, 2], [2, 2]] ;
P = [[2, 2], [2, 1], [1, 2]] ;
false.

Я подозреваю, что данный тестовый случай - простой случай, и его нужно изменить, но я позволю вам проверить его и посмотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...