打开一个文本文件转换成使用序言名单。 使用split_string谓语(Turning a te

2019-09-26 15:33发布

我试图使用split_string / 4谓词把字符串转换成字符串列表。 我想每个换行分隔的字符串。 这是我的代码看起来像

main(Argv) :-
   [InputFilename|OutputFileName] = Argv,
   read_file_to_string(InputFilename, InputFileString,[]),
   split_string(InputFileString,"\n", "\n", InputFileList),
   write(InputFileList).

但它不写任何东西到控制台。 但是,如果我把

write(InputFileString)

它打印文件的内容就好了。 我在做什么错在这里?

Answer 1:

main(Input_filename,Output_filename) :-
   read_file_to_string(Input_filename, Input_string,[]),
   split_string(Input_string,"\n", "\n", Input_list),
   write(Input_list).

示例性输入文件C:/input_data.txt

Line one
Line two
Line three

例如运行

?- main('C:/input_data.txt','C:/output_data.txt').
[Line one,Line two,Line three]
true.

您在使用|[InputFilename|OutputFileName]是用于分离的头部和一个列表的尾部。 使用简单的变化,在两个参数来传递是所有需要,例如main(Input_filename,Output_filename)

这个答案也改变了变量名的作风, 蛇的情况下这是习惯用Prolog的。



Answer 2:

如果你Argv是具有两个或多个元素的列表,它不会与统一[InputFilename|OutputFileName]因为这不是一个有两个元素的列表。

看到:

$ swipl -q
?- [a,b] = [X|Y].
X = a,
Y = [b].

?- [a,b] = [X|Y], X = a, Y = b.
false.

如果你知道你的列表中正好有2个元素,你可以使用[X, Y] 如果您的列表可以有2个以上的元素,你可以使用[X, Y|_] 这里:

?- [X,Y] = [a,b].
X = a,
Y = b.

?- [X,Y] = [a,b,c].
false.

?- [X,Y|_] = [a,b].
X = a,
Y = b.

?- [X,Y|_] = [a,b,c].
X = a,
Y = b.

?- [X,Y|_] = [a].
false.


文章来源: Turning a text file into a list using prolog. Using the split_string predicate