在prolog中读取用户输入的字符串

时间:2013-05-03 06:32:27

标签: prolog

我是Prolog的初学者。我正在使用swi prolog(刚开始使用它),我需要将用户输入字符串拆分为一个列表。我尝试了以下代码,但是我收到一条错误,指出'完全停止在子句中?无法重新定义,/ 2'

write('Enter the String'),nl,read('I').
tokenize("",[]).
tokenize(I,[H|T]):-fronttoken(I,H,X),tokenize(X,T).

有人可以帮我这个......

2 个答案:

答案 0 :(得分:3)

从您的错误消息中,很明显您正在使用SWI-Prolog。然后你可以使用它的库支持:

?- read_line_to_codes(user_input,Cs), atom_codes(A, Cs), atomic_list_concat(L, ' ', A).
|: hello world !
Cs = [104, 101, 108, 108, 111, 32, 119, 111, 114|...],
A = 'hello world !',
L = [hello, world, !].

为了更直接地处理'字符串'(实际上,字符串是一个代码列表),我在string // 1

的帮助下构建了我的分离器
:- use_module(library(dcg/basics)).

%%  splitter(+Sep, -Chunks)
%
%   split input on Sep: minimal implementation
%
splitter(Sep, [Chunk|R]) -->
    string(Chunk),
    (   Sep -> !, splitter(Sep, R)
    ;   [], {R = []}
    ).

作为DCG,应使用短语/ 2

进行调用
?- phrase(splitter(" ", Strings), "Hello world !"), maplist(atom_codes,Atoms,Strings).
Strings = [[72, 101, 108, 108, 111], [119, 111, 114, 108, 100], [33]],
Atoms = ['Hello', world, !] .

答案 1 :(得分:1)

你的第一行是其他谓词的一部分。当它在顶级使用时,它被视为没有头的规则的定义,这是无效的。

我可以复制这个:

2 ?- [user].
|: write('Enter the String'),nl,read('I').
ERROR: user://1:16:
        Full stop in clause-body?  Cannot redefine ,/2
|: 
你在你的规则中错过了一个只有身体的头。但它必须同时具备:

3 ?- [user].
|: tokenize("",[]).
|: tokenize(I,[H|T]) :- fronttoken(I,H,X),tokenize(X,T).
|: 

这没关系。