Prolog中添加否定的方法:新手请求分步详解(附示例)
嘿,作为刚接触Prolog的新手,我太懂你想搞清楚怎么给句子添加否定的需求啦!咱们一步步来实现你要的功能——把"I am coming to class"转换成"I am not coming to class"。
咱们先看你给的例子:I am coming to class
它的结构是:主语(I) + be动词(am) + 现在分词(coming) + 补语(to class)
要加否定的话,核心就是在be动词后面插入not——这是英语中这类句子的否定规则,咱们先把这个逻辑用Prolog实现。
Prolog处理列表特别顺手,所以咱们先把句子拆成单词列表。比如原句子对应:["I", "am", "coming", "to", "class"]
目标否定句对应:["I", "am", "not", "coming", "to", "class"]
咱们定义一个二元谓词negate_sentence/2,第一个参数是原句子的单词列表,第二个参数是生成的否定句列表。
% 匹配包含be动词的句子结构,在be动词后插入"not" negate_sentence([Subject, Be | Rest], [Subject, Be, "not" | Rest]) :- % 判断当前的Be是不是be动词 member(Be, ["am", "is", "are", "was", "were"]).
规则解释:
[Subject, Be | Rest]:把原列表拆成三部分——主语、be动词、剩下的单词部分(Rest)[Subject, Be, "not" | Rest]:生成新列表,就是在be动词后面加上"not",再接原来的Rest部分member(Be, ["am", "is", "are", "was", "were"]):确保我们匹配到的是be动词,避免在其他位置乱加否定词
打开Prolog控制台,输入查询:
?- negate_sentence(["I", "am", "coming", "to", "class"], Negated).
你会得到输出:
Negated = ["I", "am", "not", "coming", "to", "class"].
完美!这就是你想要的结果~
如果你的句子是第三人称,比如["He", "is", "going", "home"],这个规则也能直接用:
?- negate_sentence(["He", "is", "going", "home"], Negated). Negated = ["He", "is", "not", "going", "home"].
要是遇到过去式的句子,比如["They", "were", "playing", "football"],因为我们已经把was和were加入了be动词列表,同样能处理:
?- negate_sentence(["They", "were", "playing", "football"], Negated). Negated = ["They", "were", "not", "playing", "football"].
Prolog的核心是模式匹配,和其他语言的字符串替换思路不一样——我们是先定义句子的结构模式(主语+be动词+剩余部分),然后根据这个模式生成否定句,逻辑更清晰,也更容易扩展到其他句子结构。
内容的提问来源于stack exchange,提问作者ChaOs TitaN

