我正在尝试使用DCG将字符串拆分为两部分,用空格分隔。例如,abc def应该给我“abc”&;“def”。程序&;DCG如下。
main:-
prompt(_, ),
repeat,
read_line_to_codes(current_input, Codes),
(
Codes = end_of_file
->
true
;
processData(Codes),
fail
).
processData(Codes):-
(
phrase(data(Part1, Part2), Codes)
->
format( ~s, ~s
, [ Part1, Part2 ])
;
format( Didn t recognize data.
)
).
data([ P1 | Part1 ], [ P2 | Part2 ]) --> [ P1 | Part1 ], spaces(_), [ P2 | Part2 ].
spaces([ S | S1 ]) --> [ S ], { code_type(S, space) }, (spaces(S1); "").
这是正确的。但我发现必须键入[P1|Part1]
&[P2|Part2]
确实很冗长。因此,我尝试将[P1|Part1]
w/Part1
&;类似地,在data
的定义中,w/[P2|Part2]
,即以下内容。
data(Part1, Part2) --> Part1, spaces(_), Part2.
这更容易键入,但这给了我一个<code>参数没有充分实例化的</code>错误。因此,看起来一个未绑定的变量不会自动解释为DCG中的代码列表。有没有其他方法可以让这件事不那么冗长?我的意图是在其他编程语言中使用正则表达式的地方使用DCG。