2017-02-08 3 views
1

Отказ от ответственности: Я почти полностью знаком с clingo и отвечаю на множество заданий в целом.Решение головоломки логики с программированием ответа.

Я пытаюсь решить grid logic puzzle используя clingo. Для начала я хочу создать все модели, которые включают один экземпляр каждой категории.

Например, если есть три человека: person(a; b; c)., три дома: house(w; x; z)., и три цвета: color(r; g; y).

Я хотел бы один потенциал стабильная модель будет assign(a, r, x), assign(b, g, z), assign(c, y, w) и другой потенциал стабильной модели assign(a, g, w), assign(b, y, z), assign(c, r, x) и т. д. То есть каждый человек появляется ровно один раз и аналогично для цветов. Я полагаю, что как только у меня появятся эти модели, я могу использовать ограничения для устранения моделей, пока головоломка не будет решена.

Я попытался с помощью правила выбора и ограничения:

{assign(P, C, H)} :- person(P), color(C), house(H). 
P1=P2 :- assign(P1, C, H), assign(P2, C, H). 

Но это не совсем масштабируемой для больших головоломок со многими переменными. Может ли кто-нибудь посоветовать лучший способ сделать это?

+0

Вы должны изменить свой заголовок. ASP может ссылаться на активные серверные страницы, тема с высокой нагрузкой на переполнение стека. – Tony

+0

Вы используете ';' в 'people' и' house', но используете '' '' 'для' color', который сильно отличается. Посмотрите, что дает вам 'clingo -text '. –

ответ

1

Предполагая, что вы хотели написать color(r;g;y). как насчет следующего?

% assign each house exactly one person/color 1 {assign(P, C, H) : person(P), color(C) } 1 :- house(H). % assign each person exactly one house/color 1 {assign(P, C, H) : house(H), color(C) } 1 :- person(P). % assign each color exactly one person/house 1 {assign(P, C, H) : house(H), person(P) } 1 :- color(C).

Смежные вопросы