你可以遞歸生成一棵樹,樹的分支將根據語法的規則表示派生詞,並且葉子將用語言的語言表示詞。恢復整個有限語言就像在生成葉子時一樣簡單。
將每個節點表示爲有序的符號集合(終端或非終端)。對於每個非終結符,遞歸地下降到一組新的節點,在該節點處進行每個可能的替換。繼續,直到您的列表僅包含終端符號,然後輸出與您的節點對應的符號按順序串聯。您的初始節點將始終爲[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? –