你可以递归生成一棵树,树的分支将根据语法的规则表示派生词,并且叶子将用语言的语言表示词。恢复整个有限语言就像在生成叶子时一样简单。
将每个节点表示为有序的符号集合(终端或非终端)。对于每个非终结符,递归地下降到一组新的节点,在该节点处进行每个可能的替换。继续,直到您的列表仅包含终端符号,然后输出与您的节点对应的符号按顺序串联。您的初始节点将始终为[S]
。例如:
S = Sender, Receiver;
Sender = Human | Machine;
Human = "user-type-1" | "user-type-2"
Machine = Access, Protocol;
Access = "internal" | "external";
Protocol = "soap" | "smtp";
Receiver = "local" | "remote";
[S]
[Sender, ",", Receiver]
[Human, ",", Receiver]
["user-type-1", ",", Receiver]
["user-type-1", ",", "local"] ***
["user-type-1", ",", "remote"] ***
["user-type-2", ",", Receiver]
["user-type-2", ",", "local"] ***
["user-type-2", ",", "remote"] ***
[Machine, ",", Receiver]
[Access, ",", Protocol, ",", Receiver]
["internal", ",", Protocol, ",", Receiver]
["internal", ",", "soap", ",", Receiver]
["internal", ",", "soap", ",", "local"] ***
["internal", ",", "soap", ",", "remote"] ***
["internal", ",", "smtp", ",", Receiver]
["internal", ",", "smtp", ",", "local"] ***
["internal", ",", "smtp", ",", "remote"] ***
["external", ",", Protocol, ",", Receiver]
["external", ",", "soap", ",", Receiver]
["external", ",", "soap", ",", "local"] ***
["external", ",", "soap", ",", "remote"] ***
["external", ",", "smtp", ",", Receiver]
["external", ",", "smtp", ",", "local"] ***
["external", ",", "smtp", ",", "remote"] ***
所以,你基本上想要在右侧的套件的笛卡尔积? https://en.wikipedia.org/wiki/Cartesian_product – IVlad
U可以通过简单的递归方法生成所有句子。什么都有你尝试btw? –