#list #variables #prolog #sudoku
#Список #переменные #пролог #судоку
Вопрос:
как автоматически заполнить список переменными?
Нравится
for(i=1;i<=9,i ){
addtoanylist(X_i);
}
так, чтобы результат был похож на L = [X1, X2, X3, X4, X5, X6, X7, X8, X9]. ?
это потому, что я хочу создать список надлежащего размера для моего sudokusolver.
я получаю размер здесь:
sudoku_size_check(L) :-
len(L,N),
member(N,[4,9,16,25]), %check if its 4x4,9x9..
write('Listlength: '),
write(N),nl,
range(1,N,RangeList), %generate [1,2,3,4] in 4x4, [1..9] in 9x9..
write('Possible numbers: '),
write(RangeList), % in 4x4 its like [1,2,3,4]
nl,
retract(sudoku_settings(_,_)),
assert(sudoku_settings(N,RangeList)). %write stats into global variable
Ответ №1:
Вы можете заполнить список свободными переменными, применив предикат «length» в обратном порядке:
length(L, 9).
В результате получается L = [_G320, _G323, _G326, _G329, _G332, _G335, _G338, _G341, _G344]
— список из девяти свободных переменных, которые могут быть привязаны позже.
Это необычно для предиката с именем «длина», но если вы читаете его декларативно, « length(L, 9)
» говорит: « L
это любой список длиной 9″. Это именно то, что вы хотите — список из 9 свободных переменных соответствует наиболее общему случаю этого определения.
Комментарии:
1. Рад, что это помогло. Не могли бы вы, пожалуйста, поставить галочку, чтобы указать, что это допустимое решение?
2. @mgiuca я знаю, что это не имеет функциональной разницы, но для удобства чтения, не знаете ли вы, есть ли способ изменить схему именования свободных переменных на что-то вроде X1, X2….
3. Нет, я так не думаю. Эти имена являются внутренними для компилятора, поэтому разные компиляторы будут генерировать разные имена. В компиляторе может быть настройка, которая позволяет вам изменять ее, но в самом языке нет способа сделать это.