我正在研究SWI-Prolog中的数据库项目。问题是我想使用我从输入中读取的运动员的名字。我需要用大写字母保存他们的名字,但prolog将这些作为变量解释。任何想法如何解决这个问题?
答案 0 :(得分:2)
我会使用code_type/2
来确保输入的任何名称都以大写字母开头。
由于您希望允许用户输入带有小写或大写字母的名称,我会使用read_line_to_codes/2
读取的代码列表进行大小写转换。
由于您要将名称存储在数据库中,我使用dynamic/1
声明我将添加一些sportsname/1
条目,并使用assert/1
添加特定名称数据库。
以下是代码:
:- dynamic(sportsname/1).
:- initialization(input).
input:-
repeat,
format(user_output, 'Please enter a name (or type `quit`):\n', []),
read_line_to_codes(user_input, Codes1),
(
atom_codes(quit, Codes1)
->
!, true
;
capitalize(Codes1, Codes2)
->
atom_codes(Name, Codes2),
assert(sportsname(Name)),
format(current_output, 'Sportsname ~a writen to database.\n', [Name]),
fail
;
fail
).
capitalize([], []).
capitalize([H1|T], [H2|T]):-
code_type(H2, to_upper(H1)).
使用示例:
$ swipl sport_names.pl
Please enter a name (or type `quit`):
|: john
Sportsname John writen to database.
Please enter a name (or type `quit`):
|: James
Sportsname James writen to database.
Please enter a name (or type `quit`):
|: suzan
Sportsname Suzan writen to database.
Please enter a name (or type `quit`):
|: quit
?- sportsname(X).
X = 'John' ;
X = 'James' ;
X = 'Suzan'.
希望这有帮助!
答案 1 :(得分:1)
我不知道这段代码与实现无关,但这对我来说在SWI-Prolog中有用:
read_string(String) :-
current_input(Input),
read_line_to_codes(Input, Codes),
string_codes(String, Codes).
示例输入和输出:
?- read_string(X).
|: Test!
X = "Test!".
答案 2 :(得分:0)
使用引用的原子......
?- atom('X').
true.
?- 'X' = 'Y'.
false.
...或字符串:
?- X = "Foo!".
X = [70, 111, 111, 33].
(字符串表示为代码点列表,在本例中为ASCII码)。引用的原子更容易使用。
答案 3 :(得分:0)
只需引用Prolog需要读取的任何字符串,无论您在数据库中找到哪种情况......谨防转义:例如
?- write('O\'Neal').
O'Neal
?- read(X).
|: 'O\'Neal'.
X = 'O\'Neal'.