如何在Prolog中修改句子分析规则?

如何在Prolog中修改句子分析规则?,prolog,Prolog,在分析字符串列表时,当前规则允许逗号位于句子末尾,而不允许逗号位于单词之间,这显然是不正确的。如何修改当前规则 complexsentence --> [] ; simplesentence, complexsentence; simplesentence, delimiter, complexsentence. simplesentence --> noun, verb. delimiter --> [,].noun --> [su

在分析字符串列表时,当前规则允许逗号位于句子末尾,而不允许逗号位于单词之间,这显然是不正确的。如何修改当前规则

complexsentence --> [] ; simplesentence, complexsentence;
                   simplesentence, delimiter, complexsentence.
simplesentence --> noun, verb.
delimiter --> [,].noun --> [sun].
verb --> [shines].
% TEST: phrase(complexsentence, [sun,shines]). %must be TRUE
% TEST: phrase(complexsentence, [sun,',',shines]). %must be TRUE
% TEST: phrase(complexsentence, [sun,shines,',']). %must be FALSE

更新: 试图这样解决它。它起作用了

complexsentence --> [] ; simplesentence,complexsentence.
simplesentence -->  noun,verb;
            noun,verb,delimiter,noun;
            noun,verb,delimiter,noun,verb.
delimiter -->[,].noun-->[sun].
verb-->[shines].
% TEST: phrase(complexsentence, [sun,shines]). % TRUE
% TEST: phrase(complexsentence, [sun,',',shines]). % FALSE
% TEST: phrase(complexsentence, [sun,shines,',']). %FALSE

建议更改为DCG:

complexsentence --> simplesentence.  %was []
complexsentence --> simplesentence, complexsentence.
complexsentence --> simplesentence, delimiter, complexsentence.
simplesentence --> noun, verb.
delimiter --> [,].noun --> [sun].
verb --> [shines].
然后:

我建议第二个测试应该是错误的,因为问题描述表明,…并且不允许单词之间使用逗号


虽然原始子句(
complexsentence-->[].
)为
complexsentence
的递归定义提供了终止情况,但它有两个问题:(1)它将空句子定义为最简单的复句,(2)它允许在有效的复句上使用尾随定界符(通过第3个子句,因为您可以获得
SimpleContent,delimiter,[]
。使用
ComplexEntence-->SimpleContent.
作为基本案例更具逻辑意义,并修复了第二个问题作为奖励,因为您的其他案例在该上下文中是合乎逻辑的。

建议更改为DCG:

complexsentence --> simplesentence.  %was []
complexsentence --> simplesentence, complexsentence.
complexsentence --> simplesentence, delimiter, complexsentence.
simplesentence --> noun, verb.
delimiter --> [,].noun --> [sun].
verb --> [shines].
然后:

我建议第二个测试应该是错误的,因为问题描述表明,…并且不允许单词之间使用逗号


虽然原始子句(
complexsentence-->[].
)为
complexsentence
的递归定义提供了终止情况,但它有两个问题:(1)它将空句子定义为最简单的复句,(2)它允许在有效的复句上使用尾随定界符(通过第3个子句,因为您可以获得
SimpleContent,delimiter,[]
。使用
ComplexEntence-->SimpleContent.
作为基本案例更具逻辑意义,并修复了第二个问题作为奖励,因为您的其他案例在该上下文中是合乎逻辑的。

建议更改为DCG:

complexsentence --> simplesentence.  %was []
complexsentence --> simplesentence, complexsentence.
complexsentence --> simplesentence, delimiter, complexsentence.
simplesentence --> noun, verb.
delimiter --> [,].noun --> [sun].
verb --> [shines].
然后:

我建议第二个测试应该是错误的,因为问题描述表明,…并且不允许单词之间使用逗号


虽然原始子句(
complexsentence-->[].
)为
complexsentence
的递归定义提供了终止情况,但它有两个问题:(1)它将空句子定义为最简单的复句,(2)它允许在有效的复句上使用尾随定界符(通过第3个子句,因为您可以获得
SimpleContent,delimiter,[]
。使用
ComplexEntence-->SimpleContent.
作为基本案例更具逻辑意义,并修复了第二个问题作为奖励,因为您的其他案例在该上下文中是合乎逻辑的。

建议更改为DCG:

complexsentence --> simplesentence.  %was []
complexsentence --> simplesentence, complexsentence.
complexsentence --> simplesentence, delimiter, complexsentence.
simplesentence --> noun, verb.
delimiter --> [,].noun --> [sun].
verb --> [shines].
然后:

我建议第二个测试应该是错误的,因为问题描述表明,…并且不允许单词之间使用逗号


虽然原始子句(
complexsentence-->[].
)为
complexsentence
的递归定义提供了终止情况,但它有两个问题:(1)它将空句子定义为最简单的复句,(2)它允许在有效的复句上使用尾随定界符(通过第三个子句,因为您可以获得
SimpleContence,delimiter,[]
。使用
ComplexEntence-->SimpleContence.
作为基本情况更有逻辑意义,并修复了第二个问题作为奖励,因为您的其他情况在该上下文中是合乎逻辑的。

为什么第二个情况“必须为真”?为什么
[]
一个有效的
complexsentence
?他需要它来获得解决方案,但是(我认为)说
simplesentence
比说
[]
@DanielLyons更直观,是的,这就是我所想的
complexsentence-->simplesentence.
complexsentence-->[].
@mbrach解决了这个问题。你应该把它作为答案提交。当然,第二个测试不可能是真的,除非
simplesentence//0
变成
simplesentence-->名词;动词;名词,动词。
,因为写出来的句子必须有名词和动词,而第二个测试不是这样。为什么第二种情况“必须是真的”?为什么
[]
是有效的
complexEntence
?他需要它来获得解决方案,但是(我认为)说
simpleContent
[]更直观
@DanielLyons是的,这就是我所想的
complexsentence-->simplecontence.
complexsentence-->[].
@mbrach解决了这个问题。你应该把它作为答案提交。当然,第二个测试不可能是真的,除非
simplesentence//0
变成
simplesentence-->名词;动词;名词,动词。
,因为写出来的句子必须有名词和动词,而第二个测试不是这样。为什么第二种情况“必须是真的”?为什么
[]
是有效的
complexEntence
?他需要它来获得解决方案,但是(我认为)说
simpleContent
[]更直观
@DanielLyons是的,这就是我所想的
complexsentence-->simplecontence.
complexsentence-->[].
@mbrach解决了这个问题。你应该把它作为答案提交。当然,第二个测试不可能是真的,除非
simplesentence//0
变成
simplesentence-->名词;动词;名词,动词。
,因为写出来的句子必须有名词和动词,而第二个测试不是这样。为什么第二种情况“必须是真的”?为什么
[]
是有效的
complexEntence
?他需要它来获得解决方案,但是(我认为)说
simpleContent
[]更直观
@DanielLyons是的,这就是我所想的
complexsentence-->simplecontence.
complexsentence-->[]更有意义。
@mbrach Tha