является ли пролог хорошим языком для решения судоку или тральщика - PullRequest
0 голосов
/ 13 марта 2019

Я понимаю, что написал это как домашнее задание, но это потому, что для меня это самый простой способ понять и попытаться передать проблему. Это то, что я хочу решить для личного проекта.


У меня есть карты, разложенные в сетке, я начинаю с простого случая сетки 2x2, но в конечном итоге хочу иметь возможность экстраполировать на более крупные n × n сеток.

Все карточки лицевой стороной вниз, и на лицевой стороне карточек напечатано:

  1. положительное ненулевое целое число, представляющее «счет» карты
  2. или черное пятно.

Мне предоставляется информация о сумме баллов в каждом ряду, количестве черных пятен в каждом ряду, сумме баллов в каждом столбце и количестве черных пятен в каждом столбце.

enter image description here

Таким образом, верхний ряд должен иметь сумму очков, равную 1, и ровно одна из карт является черным пятном.

Самый правый столбец должен иметь сумму очков 2, и ровно одна из карт является черным пятном.

1025 * Etc. *

Конечно, мы видим, что приведенная выше сетка "решит" до

enter image description here


Теперь я хочу создать функцию, которая вводит данную информацию и создает сетку карточек, которая удовлетворяет этим ограничениям.

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

enter image description here

И тогда каждая «клетка» или карта в сетке сама является кортежем, первым элементом кортежа будет счет карты (или 0, если это черное пятно), а вторым элементом будет 1, если карта является черным пятном, или 0 в противном случае.

enter image description here

Так что сетка должна напоминать эту ^^

Я могу узнать, что все переменные a, b, решая этой системой уравнений:

enter image description here

(Зная также, что все эти числа являются целыми числами ≥0).


Я хотел использовать эту задачу в качестве учебного упражнения в прологе, думаю, что проблема, которую Пролог решит элегантно,

Принял ли я правильное решение или Пролог не является хорошим выбором?

Интересно, как я могу реализовать это в Прологе.

1 Ответ

0 голосов
/ 13 марта 2019

Пролог очень хорош для такого рода проблем. Посмотрите clp (fd), то есть программирование логики ограничений в конечных доменах.

Этот фрагмент демонстрирует примитивный способ решения исходного примера 2x2 в прологе SWI:

:- use_module(library(clpfd)).

 test(Vars) :-
    Vars = [TopLeft, TopRight, BottomLeft, BottomRight],
    global_cardinality([TopLeft, TopRight],       [0-1,1-_,2-_]), TopLeft + TopRight #= 1,
    global_cardinality([TopLeft, BottomLeft],     [0-1,1-_,2-_]), TopLeft + BottomLeft #= 1,
    global_cardinality([BottomLeft, BottomRight], [0-1,1-_,2-_]), BottomLeft + BottomRight #= 2,
    global_cardinality([TopRight, BottomRight],   [0-1,1-_,2-_]), TopRight + BottomRight #= 2,
    label(Vars).

Запрос:

?- test(Vars).
Vars = [1, 0, 0, 2].

Вы можете взять это как отправную точку и обобщить. Обратите внимание, что черная точка представлена ​​как 0, потому что clp (fd) имеет дело только с целыми числами.

Вот документация: http://www.swi -prolog.org / man / clpfd.html

...