2016-03-26 5 views
1

(Этот вопрос касается search/6.)ECLIPSE CLP: Пауза между промежуточными результатами и при поиске/6 в IC библиотеки

мне было интересно, если есть способ -rather чем ручной tracing- для приостановки выполнения поиска/6 каждый раз, когда было найдено новое решение для одной переменной?

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

Например, если вы пытаетесь решить классическую проблему sudoku, и вы написали набор ограничений и способ печати для своей платы, может быть полезно распечатать плату после установки ограничений, но перед поиском , чтобы оценить силу ваших ограничений. Однако, как только поиск вызван для решения судоку, у вас действительно нет обзора одиночных результатов, созданных под ними, если вы не выполните трассировку.

Было бы очень полезно, если что-то было возможно в подобных:

(это просто абстрактный пример)

% Let's imagine this is a (very poorly) constrained sudoku board 
?- problem(Sudoku),constraint(Sudoku),print(Sudoku). 
    [[1,3,_,2,_,_,7,4,_], 
    [_,2,5,_,1,_,_,_,_], 
    [4,8,_,_,6,_,_,5,_], 
    [_,_,_,7,8,_,2,1,_], 
    [5,_,_,_,9,_,3,7,_], 
    [9,_,_,_,3,_,_,_,5], 
    [_,4,_,_,_,6,8,9,_], 
    [_,5,3,_,_,1,4,_,_], 
    [6,_,_,_,_,_,_,_,_]] 

Теперь для поиска:

?- problem(Sudoku),constraint(Sudoku),search_pause(Sudoku,BT),print(Sudoku,BT). 
    [[1,3,6,2,_,_,7,4,_], 
    [_,2,5,_,1,_,_,_,_], 
    [4,8,_,_,6,_,_,5,_], 
    [_,_,_,7,8,_,2,1,_], 
    [5,_,_,_,9,_,3,7,_], 
    [9,_,_,_,3,_,_,_,5], 
    [_,4,_,_,_,6,8,9,_], 
    [_,5,3,_,_,1,4,_,_], 
    [6,_,_,_,_,_,_,_,_]] 
    Board[1,3] = 6 
    Backtracks = 1 

    more ; 

ответ

2

Использование существующих инструментов визуализации

Посмотрите на Visualization Tools Manual. Вы можете получить нужный тип матричного дисплея, добавив в код код viewable_create/2 и запустив Клиент визуализации от . Меню инструментов TkECLiPSe.

Используя собственный инструментальный поиск рутинную

Вы можете заменить indomain_xxx метод выбора в search/6 с определенным пользователем, где вы можете распечатать информацию до и/или после распространения.

Если этого недостаточно, вы можете заменить весь встроенный search/6 на свой собственный, что не так сложно, см., Например, ECLiPSe Tutorial chapter on tree search или мой ответ this question.

Трассировка с использованием средств, управляемых данными

Использование средства управления, управляемые данными ECLIPSE, вы можете довольно легко отображать информацию, когда некоторые вещи случаются с вашими переменными. В простейшем случае, если вы что-то на переменном экземпляре:

?- suspend(printf("X was instantiated to %w%n",[X]), 1, X->inst), 
    writeln(start), X=3, writeln(end). 

start 
X was instantiated to 3 
end 

Основываясь на этой идее, вы можете написать code that allows you to follow labeling and propagation steps даже тогда, когда они происходят внутри поисковой рутины черного ящика. Подробнее см. Ссылку.

+0

Это прекрасно! Спасибо! – SND