TL;DR: Не используйте get0/1
!
get0/1
считается устаревшим даже процессорами Prolog, которые его реализуют (например, SWI).
Вместо этого используйте get_char/1
и представляйте строки в виде списков. символовне в виде списков кодов!
read_command(Chars) :-
get_char(Next),
read_command_aux(Chars, Next).
read_command_aux(Chars, Char) :-
member(Char, ['.', '\t', '\n', end_of_file]),
!,
Chars = [].
read_command_aux([Char|Chars], Char) :-
get_char(Next),
read_command_aux(Chars, Next).
Вот несколько примеров запросов с использованием SWI-Prolog 7.3.15:
?- read_command(Chars).
|: abc
Chars = [a, b, c].
?- read_command(Chars).
|: abc.
Chars = [a, b, c].
?- read_command(Chars).
|: 123abc
Chars = ['1', '2', '3', a, b, c].
Для дальнейшего использования команд вы можете использовать атомы, например:
?- read_command(Chars), atom_chars(Command, Chars).
|: abcd.
Chars = [a, b, c, d],
Command = abcd.
Обратите внимание, что это работает не только с SWI, но и с SICStus Prolog 4.3.2 (и другими).
person
repeat
schedule
22.01.2016