在 Prolog 中处理用户对 "phrase/3" 方法的输入
Process user input to "phrase/3" method in Prolog
我已经用 Prolog 构建了一个 DCG。当我执行以下调用时,代码有效:
phrase(programm(R), [1,+,2], []).
我想让用户写输入,所以我这样做了:
main :- read(Input), atom_chars(Input, R), write(R), phrase(programm(E), R).
调用 main 和 input 例如“1+2”不起作用。如何处理用户输入的短语方法来调用我的 DCG?
SWI-Prolog 通过 tokenize_atom 提供了一种方便的方法。
program(sum(L,R)) --> [L, +, R].
?- tokenize_atom('1 + 2', L), phrase(program(P), L).
L = [1, +, 2],
P = sum(1, 2).
根本问题在于您在语法中定义字符和数字的方式。我假设你定义了一些东西:
program(sum(L,R)) -->
[L],
[+],
[R].
你首先需要
:- set_prolog_flag(double_quotes, chars).
program(sum(L,R)) -->
number(L),
"+",
number(R).
number(1) --> "1".
注意 1
是整数,"1"
是 ['1']
!
我已经用 Prolog 构建了一个 DCG。当我执行以下调用时,代码有效:
phrase(programm(R), [1,+,2], []).
我想让用户写输入,所以我这样做了:
main :- read(Input), atom_chars(Input, R), write(R), phrase(programm(E), R).
调用 main 和 input 例如“1+2”不起作用。如何处理用户输入的短语方法来调用我的 DCG?
SWI-Prolog 通过 tokenize_atom 提供了一种方便的方法。
program(sum(L,R)) --> [L, +, R].
?- tokenize_atom('1 + 2', L), phrase(program(P), L).
L = [1, +, 2],
P = sum(1, 2).
根本问题在于您在语法中定义字符和数字的方式。我假设你定义了一些东西:
program(sum(L,R)) -->
[L],
[+],
[R].
你首先需要
:- set_prolog_flag(double_quotes, chars).
program(sum(L,R)) -->
number(L),
"+",
number(R).
number(1) --> "1".
注意 1
是整数,"1"
是 ['1']
!