пролог заполнить список автоматически переменными в цикле - PullRequest
4 голосов
/ 03 июня 2011

как автоматически заполнить список переменными?

как

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 Ответ

9 голосов
/ 03 июня 2011

Вы можете заполнить список свободными переменными, применив предикат «length» в обратном порядке:

length(L, 9).

В результате получается L = [_G320, _G323, _G326, _G329, _G332, _G335, _G338, _G341, _G344] - список из девяти свободных переменных, которые могут быть связаны впозже.

Это необычно для предиката, называемого "длина", но если вы читаете его декларативно, "length(L, 9)" говорит: "L - это любой список длины 9".Это именно то, что вы хотите - список из 9 свободных переменных соответствует наиболее общему случаю этого определения.

...