忽略其余输入的首选方法是什么?我发现了一种有点冗长的方式:
ignore_rest --> [].
ignore_rest --> [_|_].
它有效:
?- phrase(ignore_rest, "foo schmoo").
true ;
但是当我试图将这两条规则分解为:
ignore_rest2 --> _.
然后它没有:
?- phrase(ignore_rest2, "foo schmoo").
ERROR: phrase/3: Arguments are not sufficiently instantiated
答案 0 :(得分:4)
你想要的是声明有一系列任意多个字符。描述这个的最简单方法是:
... -->
[].
... -->
[_],
... .
使用[_|_]
作为非终端,是一个SWI-Prolog特定的扩展,这是一个很大的问题。事实上,在过去,[_|_]
有几个不同的扩展/解释。最值得注意的是,当'.'/4
被用作非终端时,Quintus Prolog允许定义要调用的用户定义的[_|_]
。请注意,[_|[]]
仍被视为终端!实际上,这是一个实现错误。但是,它被利用了。请参阅以下示例:
David B. Searls,用明确的条款语法研究DNA的语言学。 NACLP 1989。
答案 1 :(得分:4)
为什么不简单地使用phrase/3
代替phrase/2
?例如,假设您有一个prefix//0
非终端仅消耗部分输入:
?- phrase(prefix, Input, _).
phrase/3
的第三个参数返回非消费终端,您可以忽略它们。