如何读取GNU-Prolog中的文件

时间:2016-01-02 16:57:28

标签: prolog

我有一个脚本来解决数独,但我应该读取这种格式的文件

1. 3. 5.
1. 4. 3.
1. 6. 6.
1. 7. 7.
2. 2. 9.
2. 5. 7.
2. 8. 1.
3. 1. 6.
3. 4. 1.
3. 6. 2.
3. 9. 5.
4. 1. 4.
4. 3. 9.
4. 7. 8.
4. 9. 3.
5. 2. 5.
5. 8. 6.
6. 1. 7.
6. 3. 6.
6. 7. 9.
6. 9. 1.
7. 1. 5.
7. 4. 7.
7. 6. 9.
7. 9. 8.
8. 2. 3.
8. 5. 2.
8. 8. 9.
9. 3. 1.
9. 4. 8.
9. 6. 3.
9. 7. 4.

我的脚本进入参数 suduko(A1,A2,A3,A4,A5,A6,A7,A8,A9, B1,B2,B3,B4,B5,B6,B7,B8,B9, C1,C2,C3,C4,C5,C6,C7,C8,C9, D1,D2,D3,D4,D5,D6,D7,D8,D9, E1,E2,E3,E4,E5,E6,E7,E8,E9, F1,F2,F3,F4,F5,F6,F7,F8,F9, G1,G2,G3,G4,G5,G6,G7,G8,G9, H1,H2,H3,H4,H5,H6,H7,H8,H9, I1,I2,I3,I4,I5,I6,I7,I8,I9) 我应该用文件中的值替换它们中的一些,例如A3 = 5,A4 = 3

我不知道如何阅读此文件并在我的代码中使用该变量。

由于

1 个答案:

答案 0 :(得分:1)

保存一个名为'sudoku.txt'的文件后,read_file / 2产生所需的参数列表,然后使用univ(= ..)连接functor(谓词名称)和参数:

?- Pred = suduko(
    A1,A2,A3,A4,A5,A6,A7,A8,A9,
    B1,B2,B3,B4,B5,B6,B7,B8,B9,
    C1,C2,C3,C4,C5,C6,C7,C8,C9,
    D1,D2,D3,D4,D5,D6,D7,D8,D9,
    E1,E2,E3,E4,E5,E6,E7,E8,E9,
    F1,F2,F3,F4,F5,F6,F7,F8,F9,
    G1,G2,G3,G4,G5,G6,G7,G8,G9,
    H1,H2,H3,H4,H5,H6,H7,H8,H9,
    I1,I2,I3,I4,I5,I6,I7,I8,I9),
Pred =.. [_|B], read_file('sudoku.txt', B), call(Pred).

read_digit(Stream, Digit) :-
    read(Stream, Digit), integer(Digit), Digit >= 1, Digit =< 9.

read_cell(Stream, Matrix) :-
    read_digit(Stream, RowIx),
    read_digit(Stream, ColIx),
    read_digit(Stream, Val),
    CellIx is (RowIx-1)*9 + ColIx,
    nth1(CellIx, Matrix, Val),
    !, read_cell(Stream, Matrix).
read_cell(_Stream, _Matrix).

read_file(Path, Bindings) :-
    open(Path, read, Stream),
    read_cell(Stream, Bindings),
    close(Stream).

% test
read_file :- read_file('sudoku.txt', B), write(B), nl.