пролог автоматически заполняет список переменными в цикле

#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. Нет, я так не думаю. Эти имена являются внутренними для компилятора, поэтому разные компиляторы будут генерировать разные имена. В компиляторе может быть настройка, которая позволяет вам изменять ее, но в самом языке нет способа сделать это.