如何在DCG中提取给出后缀的前缀

时间:2014-03-23 16:05:08

标签: prolog dcg

pc --> [ta] -> [tb] -> [tc] .

如果我有tc,如何将[ta,tb]放入变量?

如果我有明确条款中定义的列表的尾部,我如何将前面的元素作为未知长度的列表?

我希望这种方法可以扩展到查询时已知的字符串前缀被删除后缀的情况。

例如,给定" sweetness",使用描述后缀的DCG" ness"绑定" sweet"变量。

不要只使用'追加'。

以下示例不是问题的一部分,它们是其他人在直到复杂阶段学习明确条款的信息。

pa --> [ta] .

可以用

进行测试
phrase(pa,[ta]) .

要使用匹配填充变量,请执行

phrase(ptrn,Variable) .

pb --> [ta] -> [tb] .

可以使用

获取head元素
phrase(pb,[Head|[tb]]) .

1 个答案:

答案 0 :(得分:0)

假设来自library(dcg_basics)的SWI-Prolog,string//1非终端应该按照您想要的方式工作:

?- use_module(library(dcg/basics)).
...

?- phrase((string(L), [pc]), [pa,pb,pc]).
L = [pa, pb] ;
false.

实施非常简单:

string([]) -->
    [].
string([H|T]) -->
    [H],
    string(T).

OT:您使用->//2作为序列,虽然它应该适用于您的简单情况,但请注意它确实引入了if / then / else结构。