Prolog 中的定子句语法 - Or 语句
Definite clause grammar in Prolog - Or statement
定义可以用两种方式之一描述副词的短语的最佳方式是什么?
你能不能说:
adverb_phrase(N,adv(N,Adv)) --> Way 1.
adverb_phrase(N,adv(N,Adv)) --> Way 2.
我试过这样做,但我在输出中得到变量(如 _G12345
),这看起来不正确。
是,您所展示的绝对是 有效 在 DCG 中陈述备选方案的方式。
还有其他选择。这里有一些:
1。你的版本
这是您的版本,仅扩展为更完整的示例:
adverb_phrase(N, adv(N,Adv)) --> adv1(Adv).
adverb_phrase(N, adv(N,Adv)) --> adv2(Adv).
adv1(likely) --> [].
adv2(happily) --> [].
示例查询和答案:
?- phrase(adverb_phrase(N,A), Ls).
A = adv(N, likely),
Ls = [] ;
A = adv(N, happily),
Ls = [].
在回溯上找到了两个解法。变量 N
也出现在查询中。不知道你为什么要介绍,如果不需要,可以省略。
2。更紧凑
使用不同的规则来表示备选方案是直截了当的。请注意,您可以重构代码以使其更紧凑:
adverb_phrase(N, adv(N,Adv)) --> adv(Adv).
adv(likely) --> [].
adv(happily) --> [].
在这种情况下,我只是使用 相同的 非终结符来表示备选方案。
3。使用 ('|')//2
请注意,还有其他方式来表示备选方案。一种优雅的方法是使用 ('|')//2
,类似于其他形式中通常表示替代方案的方式。
例如,您可以将初始示例写为:
adverb_phrase(N, adv(N,Adv)) --> adv1(Adv) | adv2(Adv).
adv1(likely) --> [].
adv2(happily) --> [].
如果需要,您也可以使用 (;)//2
代替 ('|')//2
,类似于普通的 Prolog。
显示的变体产生完全相同的答案。您选择的版本取决于几个因素,例如:您是在 "grammar" 还是在 "monad" 意义上更多地使用 DCG。
对于您的具体情况,从第一印象来看,版本 2 似乎很合适。
请注意,这些选项都不是 "or statement"。我们称这些为 非终结符!
定义可以用两种方式之一描述副词的短语的最佳方式是什么?
你能不能说:
adverb_phrase(N,adv(N,Adv)) --> Way 1.
adverb_phrase(N,adv(N,Adv)) --> Way 2.
我试过这样做,但我在输出中得到变量(如 _G12345
),这看起来不正确。
是,您所展示的绝对是 有效 在 DCG 中陈述备选方案的方式。
还有其他选择。这里有一些:
1。你的版本
这是您的版本,仅扩展为更完整的示例:
adverb_phrase(N, adv(N,Adv)) --> adv1(Adv). adverb_phrase(N, adv(N,Adv)) --> adv2(Adv). adv1(likely) --> []. adv2(happily) --> [].
示例查询和答案:
?- phrase(adverb_phrase(N,A), Ls). A = adv(N, likely), Ls = [] ; A = adv(N, happily), Ls = [].
在回溯上找到了两个解法。变量 N
也出现在查询中。不知道你为什么要介绍,如果不需要,可以省略。
2。更紧凑
使用不同的规则来表示备选方案是直截了当的。请注意,您可以重构代码以使其更紧凑:
adverb_phrase(N, adv(N,Adv)) --> adv(Adv). adv(likely) --> []. adv(happily) --> [].
在这种情况下,我只是使用 相同的 非终结符来表示备选方案。
3。使用 ('|')//2
请注意,还有其他方式来表示备选方案。一种优雅的方法是使用 ('|')//2
,类似于其他形式中通常表示替代方案的方式。
例如,您可以将初始示例写为:
adverb_phrase(N, adv(N,Adv)) --> adv1(Adv) | adv2(Adv). adv1(likely) --> []. adv2(happily) --> [].
如果需要,您也可以使用 (;)//2
代替 ('|')//2
,类似于普通的 Prolog。
显示的变体产生完全相同的答案。您选择的版本取决于几个因素,例如:您是在 "grammar" 还是在 "monad" 意义上更多地使用 DCG。
对于您的具体情况,从第一印象来看,版本 2 似乎很合适。
请注意,这些选项都不是 "or statement"。我们称这些为 非终结符!