Parsing 使用CHR(约束处理规则)进行解析

Parsing 使用CHR(约束处理规则)进行解析,parsing,prolog,constraints,dcg,chr,Parsing,Prolog,Constraints,Dcg,Chr,尝试使用CHR(约束处理规则)进行某种解析 我想到了这个(还在学习) 应改为: is([the,box],on([the,table])) 为了让它发挥作用,我必须考虑如何对“on”和“is”进行后期绑定,因此-X已经被“收集” 第二个问题是如何编写CHR规则,以便它们解析列表,而不是制定w(..)目标 PS>此外,欢迎提供有关DCG与CHR混合的任何信息。什么也找不到 我认为这不一定是个好主意。我尤其不认为它会比使用DCG更容易。您仍然需要编写某种适当的语法,了解输入的结构,而不仅仅是“组合

尝试使用CHR(约束处理规则)进行某种解析 我想到了这个(还在学习)

应改为:

is([the,box],on([the,table]))
为了让它发挥作用,我必须考虑如何对“on”和“is”进行后期绑定,因此-X已经被“收集”

第二个问题是如何编写CHR规则,以便它们解析列表,而不是制定w(..)目标


PS>此外,欢迎提供有关DCG与CHR混合的任何信息。什么也找不到

我认为这不一定是个好主意。我尤其不认为它会比使用DCG更容易。您仍然需要编写某种适当的语法,了解输入的结构,而不仅仅是“组合某些单词序列”。也就是说,有一些关于使用CHR进行解析的工作,例如,请参见

第一个问题是CHR约束是无序的。当您尝试匹配
w(L)、w(on)、w(R)
时,您无法保证
L
实际上位于输入中
R
的左侧。此信息不是为您记录的

所以你能做的就是自己记录下来。您可以将每个
w(X)
替换为
w(X,开始,结束)
约束,其中
Start
End
是某种类型的输入位置标记。例如,只需从左到右为令牌编号:

:- use_module(library(chr)).

:- chr_constraint w/3.

parse(Tokens) :-
    parse(Tokens, 0).

parse([], _Position).
parse([Token | Tokens], Position) :-
    NextPosition is Position + 1,
    w(Token, Position, NextPosition),
    parse(Tokens, NextPosition).
您可以按如下方式使用它:

?- parse([the, box, is, on, the, table]).
w(table, 5, 6),
w(the, 4, 5),
w(on, 3, 4),
w(is, 2, 3),
w(box, 1, 2),
w(the, 0, 1).
给定此格式,您可以增强匹配规则以仅合并相邻的输入(其中每个组件的结束标记与“下一个”组件的开始标记相同):

我们看到,位置4至5和位置5至6处的
表格
合并为位置4至6处的短语
表格
。此外,单词
the
box
is
on
,被合并为一个对象,覆盖位置0到4。但这是不正确的:“盒子开着”不是一个有效的短语。“is”右边的短语必须是位置或其他情况。您需要更多关于短语中的子短语类型的信息。您需要正确的语法信息,这种信息可以通过定义具有不同名称的规则在DCG中进行编码

以下是一个扩展版本:

:- chr_constraint noun_phrase/3, situation/3, sentence/3.

w(the, S, M), w(X, M, E) <=>
    noun_phrase([the,X], S, E).
w(on, S, M), noun_phrase(R, M, E) <=>
    situation(on(R), S, E).
noun_phrase(L, S, M1), w(is, M1, M2), situation(R, M2, E) <=>
    sentence(is_(L,R), S, E).
但此时,您正在使用难看的语法编写DCG,并且必须手动跟踪大量额外信息。为什么不写DCG呢

noun_phrase([the, X]) -->
    [the],
    [X].

situation(on(Place)) -->
    [on],
    noun_phrase(Place).

sentence(is_(Thing, Where)) -->
    noun_phrase(Thing),
    [is],
    situation(Where).
这同样适用于:

?- phrase(sentence(Sentence), [the, box, is, on, the, table]).
Sentence = is_([the, box], on([the, table])).
如果希望将此信息放入CHR约束中,可以通过调用该约束来实现。例如,对于上面的DCG:

:- chr_constraint sentence/1.

parse(Tokens) :-
    phrase(sentence(Sentence), Tokens),
    sentence(Sentence).
这将获得与上述相同的CHR结果,但没有不再需要的位置标记:

?- parse([the, box, is, on, the, table]).
sentence(is_([the, box], on([the, table]))).

我认为这不一定是个好主意。我尤其不认为它会比使用DCG更容易。您仍然需要编写某种适当的语法,了解输入的结构,而不仅仅是“组合某些单词序列”。也就是说,有一些关于使用CHR进行解析的工作,例如,请参见

第一个问题是CHR约束是无序的。当您尝试匹配
w(L)、w(on)、w(R)
时,您无法保证
L
实际上位于输入中
R
的左侧。此信息不是为您记录的

所以你能做的就是自己记录下来。您可以将每个
w(X)
替换为
w(X,开始,结束)
约束,其中
Start
End
是某种类型的输入位置标记。例如,只需从左到右为令牌编号:

:- use_module(library(chr)).

:- chr_constraint w/3.

parse(Tokens) :-
    parse(Tokens, 0).

parse([], _Position).
parse([Token | Tokens], Position) :-
    NextPosition is Position + 1,
    w(Token, Position, NextPosition),
    parse(Tokens, NextPosition).
您可以按如下方式使用它:

?- parse([the, box, is, on, the, table]).
w(table, 5, 6),
w(the, 4, 5),
w(on, 3, 4),
w(is, 2, 3),
w(box, 1, 2),
w(the, 0, 1).
给定此格式,您可以增强匹配规则以仅合并相邻的输入(其中每个组件的结束标记与“下一个”组件的开始标记相同):

我们看到,位置4至5和位置5至6处的
表格
合并为位置4至6处的短语
表格
。此外,单词
the
box
is
on
,被合并为一个对象,覆盖位置0到4。但这是不正确的:“盒子开着”不是一个有效的短语。“is”右边的短语必须是位置或其他情况。您需要更多关于短语中的子短语类型的信息。您需要正确的语法信息,这种信息可以通过定义具有不同名称的规则在DCG中进行编码

以下是一个扩展版本:

:- chr_constraint noun_phrase/3, situation/3, sentence/3.

w(the, S, M), w(X, M, E) <=>
    noun_phrase([the,X], S, E).
w(on, S, M), noun_phrase(R, M, E) <=>
    situation(on(R), S, E).
noun_phrase(L, S, M1), w(is, M1, M2), situation(R, M2, E) <=>
    sentence(is_(L,R), S, E).
但此时,您正在使用难看的语法编写DCG,并且必须手动跟踪大量额外信息。为什么不写DCG呢

noun_phrase([the, X]) -->
    [the],
    [X].

situation(on(Place)) -->
    [on],
    noun_phrase(Place).

sentence(is_(Thing, Where)) -->
    noun_phrase(Thing),
    [is],
    situation(Where).
这同样适用于:

?- phrase(sentence(Sentence), [the, box, is, on, the, table]).
Sentence = is_([the, box], on([the, table])).
如果希望将此信息放入CHR约束中,可以通过调用该约束来实现。例如,对于上面的DCG:

:- chr_constraint sentence/1.

parse(Tokens) :-
    phrase(sentence(Sentence), Tokens),
    sentence(Sentence).
这将获得与上述相同的CHR结果,但没有不再需要的位置标记:

?- parse([the, box, is, on, the, table]).
sentence(is_([the, box], on([the, table]))).

哇,还在读。。。Swi支持CHR语法吗?我一直在考虑解析DCG样式,并使用CHR为特殊情况编写约束等等。诱拐性地得到越来越好的表现。。。请注意,这只是一个想法。我刚刚找到了关于CHR的。。即使是更疯狂的想法,在我习惯之后。。。要找出基本的解析运算符!,然后通过句子结构的例子,让约束驱动工作语法的发现。(F.e.Sequitur compress algo对单行语法(即句子到->语法,但是预先确定的结构)这听起来是个有趣的想法,但你可能只应该在你的blocks world使用一些更简单的语法时尝试一下:-)是的。。我还得学中文。。CHRG看起来也很有希望,但是没有太多实用的文档和教程。我发现的论文太专业了哇,还在读。。。Swi支持CHR语法吗?我一直在考虑解析DCG样式,并使用CHR为特殊情况编写约束等等。诱拐性下注