我一直在尝试使用phrase_from_file
解析包含整数行的文件和语法规则
line --> I,line,{integer(I)}.
line --> ['\n'].
因此:phrase_from_file(line,'input.txt').
它失败了,我很快就试图追踪它。
我甚至试图打印I
,但它甚至没有到达那里。
EDIT ::
由于下面的解决方案都不能满足我的需求(使用read/1
假设您正在阅读术语,有时候写DCG可能需要花费太长时间),我用谷歌搜索了this代码,主要变化是增加:
read_rest(-1,[]):-!.
read_word(C,[],C) :- ( C=32 ;
C=(-1)
) , !.
答案 0 :(得分:4)
如果您使用的是phrase_from_file/2
,那么在阅读实际文件之前,有一种非常简单的方法可以测试您的程序。只需使用phrase/2
拨打同一个非终端即可。因此,一个目标
phrase(line,"1\n2").
与调用
相同phrase_from_file(line,fichier)
当fichier是包含3个以上字符的文件时。因此,您可以使用phrase/2
以非常紧凑的方式进行测试和实验。
@Jan Burse已经提到了进一步的问题。 SWI读入字符代码。所以你必须写
newline --> "\n".
换行。然后你仍然需要自己解析整数。但是使用phrase/2
可以更轻松地测试所有内容。好的是,您可以切换到读取文件而不更改实际的DCG代码。
答案 1 :(得分:3)
我想这里有一个概念问题。虽然我不知道phrase_from_file / 2的细节,即你正在使用哪个Prolog系统,但我仍然认为它会产生字符代码。因此,对于文件中的整数123,您将获得字符代码0'1,0'2和0'3。这可能不是你想要的。
如果你想处理这些字符,你需要使用非终端而不是裸骨变量I来获取它们。而不是整数测试,你需要一个字符测试,你可以提前做测试:
line --> [I], {0'0=<I, I=<0'9}, line.
最好的问候
P.S。:您也可以使用术语读取操作,而不是采用DCG方式。也可以看看: read numbers from file in prolog and sorting