如何解析输入句子?

时间:2018-04-09 15:02:50

标签: prolog

我正在制作一个程序,它接受用户输入并根据用户的选项选择处理输入。假设我输入一个类似&#34的字符串;你好4是一个数字,5也是#34;。如何从字符串中取出数字并将它们放在变量中? (在我的例子中,我希望使用4和5。)

1 个答案:

答案 0 :(得分:0)

所以,我写了一些代码来解决你的问题。第一个也是最简单的情况:你将句子作为列表传递,如[hello,4,is,5,and]。在这种情况下,您需要检查列表中的元素是否为数字with number/1

parseSentence([],[]).
parseSentence([H|T],L):-
    \+(number(H)),
    parseSentence(T,L).
parseSentence([H|T],[H|T1]):-
    number(H),
    parseSentence(T,T1).

?- parseSentence([hello,4,is,5,and],L).
L = [4, 5].
false

第二个也是最有趣的案例:你将句子作为字符串传递,如下所示:" hello 4是一个数字,5也是#34;。这里的代码(有点多余,以使其更清晰):

parseSentenceMod([],[]).
parseSentenceMod([H|T],[A|T1]):-
    atom_number(H,A), 
    parseSentenceMod(T,T1).
parseSentenceMod([H|T],L):-
    \+(atom_number(H,_)),
    parseSentenceMod(T,L).

findAtom([],[]).
findAtom([H|T],[H1|T1]):-
    atom_string(H1,H),
    findAtom(T,T1).

parseString(S,P,A,N):-
    split_string(S," ","",P),
    findAtom(P,A),
    parseSentenceMod(A,N).

?- parseString("hello 4 is a number, and 5 is as well",S,A,N).
A = [hello, '4', (is), a, 'number,', and, '5', (is), (as), well],
N = [4, 5],
S = ["hello", "4", "is", "a", "number,", "and", "5", "is", "as", "well"]
false

atom_number/2检查原子是否为数字,atom_string/2创建给定字符串的原子,split_string/4将字符串拆分为子串,在本例中为空格。希望它有所帮助。