如何在GNU Prolog中读取文件

如何在GNU Prolog中读取文件,prolog,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.95. 4.1.4. 4.3.9. 4.7.8. 4.93. 5.2.5. 5.8.6. 6.1.7. 6.3.6. 6.7.9. 6.91. 7.1.5. 7.4.7. 7.6.9. 7.98. 8.2.3. 8.5.2. 8.8.9. 9

我有一个解决数独问题的脚本,但我应该阅读这个格式的文件


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.95.
4.1.4.
4.3.9.
4.7.8.
4.93.
5.2.5.
5.8.6.
6.1.7.
6.3.6.
6.7.9.
6.91.
7.1.5.
7.4.7.
7.6.9.
7.98.
8.2.3.
8.5.2.
8.8.9.
93.1.
94.8.
96.3.
97.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

我不知道如何读取此文件并在代码中使用变量


谢谢

将数据保存在名为“sudoku.txt”的文件中后,read_file/2生成所需的参数列表,然后使用univ(=…)连接函子(谓词名称)和参数:

?- 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.
?-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],读取文件('sudoku.txt',B),调用(Pred)。
读取数字(流、数字):-
读取(流,数字),整数(数字),数字>=1,数字=<9。
读取单元(流、矩阵):-
读取数字(流、行),
读取数字(流、ColIx),
读取数字(流、值),
CellIx为(RowIx-1)*9+ColIx,
nth1(CellIx,矩阵,Val),
!, 读取单元(流、矩阵)。
读取单元(_流,_矩阵)。
读取文件(路径、绑定):-
打开(路径、读取、流),
读取单元(流、绑定),
关闭(流)。
%试验
读文件:-读文件('sudoku.txt',B),写文件(B),nl。

查找
read/1
谓词。你读过这个吗:是的,但我没有解开,在我的案例中如何使用它请改进你的问题!这还有很多需要改进的地方。增加你得到好答案的机会!以这种格式读取文件是相当罕见的。相反,人们通常只读一个术语来描述整个情况。在您的情况下,列表是最自然的。我按照您的建议做了,我有一个错误:|?-read_文件。未捕获异常:错误(语法错误('sudoku.txt:1(char:7)}或应为运算符),读取/2)我使用最新的GnupLog测试。也许你的sudoku.txt不正确?每个数字后面必须紧跟一个dotYes,这是文件格式中的一个错误,但现在我遇到了这个错误:yes |?-readfile。未捕获异常:错误(存在错误(过程,读取文件/0),顶层/0)|?-非常感谢,它可以工作,最后一个问题,为什么要在=之后放入(..):Pred=。。读文件('sudoku.txt',B),调用(Pred)。它被称为univ,一个专门的操作员。看见