如何在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,一个专门的操作员。看见