我正在尝试解决包含以下内容的类的问题:
用从 1 到 6 的不同数字填充每个桶侧的白色单元格。数字不能在每个水平和垂直方向上重复。桶顶部的每个数字必须等于桶中四个不同数字的总和或乘积。所有最高数字都不同且小于 91。
我可以很好地获得结果,但我需要显示桶的结果,当我运行我的基本案例时,它会显示:
[_24087,18,60,17,_24343,72,_24471,_24535,14]
[1,2,3,4,5,6,3,4,5,6,1,2,2,5,1,3,6,4,4,6,2,5,3,1,5,1,6,2,4,3,6,3,4,1,2,5]
Result achieved in 0.015 sec.
Resumptions: 6197
Entailments: 1306
Prunings: 3520
Backtracks: 62
Constraints created: 107
第一个列表是桶,第二个列表是用标签计算的矩阵。
为了计算桶,我使用这个规则:
getlist(Matrix,CounterX,CounterY,InnerSize,Value), % gets the barrel sublist
all_distinct(Value),
sum(Value, #=, SSet), % sum
prod(Value, VSet), % product
Set #= SSet #\/ Set #= VSet, % chooses one
Set #=< MaxValue,
insertinto(Set, List, NewList), % inserts into the barrel list
由于 SICStus 没有产品计算规则,我创建了这个:
prod([H|T], R) :-
prod(T, H, R).
prod([], R, R).
prod([H|T], V, R) :-
NV #= H * V,
prod(T, NV, R).
我不明白问题究竟出在哪里。
- 在我的产品规则中 - >它似乎正确统一但似乎不是当 1 在子列表中时。
- 我如何统一 sum 或 prod -> 也许那个桶可以是 sum 或 prod 并且不能正确地与Set统一。