Как оптимизировать решение проблем с упаковкой в ​​GProlog

Я новичок в GProlog, и у меня есть школьный проект по проблеме упаковки квадратов (упаковка подквадратов в основной квадрат).

bool_to_int(B, I) :-
B -> I = 1; I = 0.

sum_size([], [], _, 0).
sum_size([X|Xs], [T|Ts], V, S) :-
    sum_size(Xs, Ts, V, S2),
    bool_to_int(X #=< V #/\ V #< X + T, I),
    S #= S2 + T * I.

Вот независимая часть моего кода, ее цель - оптимизировать решение проблемы упаковки квадратов, проверяя, равна ли сумма выровненных квадратов заданной константе (здесь S). Xs — это координаты подквадратов по оси X для упаковки в основной квадрат, а Ts — их размер.

Вот моя проблема с этим кодом:

sum_size([0, 0, 1, 2, 2, 2], [2, 1, 1, 1, 1, 1], 0, 3).
-> true

В данном примере основной квадрат 3х3. Таким образом, это ожидаемый ответ для упаковки всех подквадратов в основной: [0, 0, 1, 2, 2, 2] являются допустимыми координатами.

Теперь я хочу, чтобы GProlog решил это для меня, написав следующее:

length(L, 6), sum_size(L, [2, 1, 1, 1, 1, 1], 0, 3).
-> no

И я не понимаю, почему ответ «нет» вместо того, чтобы дать мне возможное значение для L.


person Community    schedule 30.11.2018    source источник
comment
Как определяется sum_for_all/4?   -  person lurker    schedule 30.11.2018
comment
Извини, моя ошибка. Я имел в виду сумма_размера. Исправленный.   -  person    schedule 30.11.2018
comment
Связанный вопрос: Prolog Constraint Processing: Packing Squares   -  person mat    schedule 30.11.2018