我会用 DCG 来解决这个问题。
sentence(S) --> color_statement(S) ; on_statement(S).
det --> [a].
det --> [the].
color_statement(color(Noun, Color)) --> det, [Noun], [is], color(Color).
color(Color) --> [Color], { color(Color) }.
color(red). color(blue).
on_statement(on(Noun, Place)) --> det, [Noun], [is,on], det, [Place].
这是假设您有某种标记化,但出于演示目的,您会发现这个“有效”:
?- phrase(sentence(S), [the,pen,is,on,the,bookshelf]).
S = on(pen, bookshelf).
毫无疑问,您需要为您的目的扩展这些规则。你可以通过搜索找到标记化的东西,只有你确切地知道你想要支持的名词和修饰符的种类,所以这实际上只是一个如何进行的草图。
从这里您将创建另一个规则来处理多个语句。
clause([]) --> [].
clause([S|Rest]) --> sentence(S), ['.'], clause(Rest).
测试它的工作方式如下:
?- phrase(clause(S), [the,pen,is,on,the,bookshelf,'.',the,pen,is,red,'.']).
S = [on(pen, bookshelf), color(pen, red)]
所以这些是你想要的条款。现在您只需要一个谓词将它们组合在一起。
list_and([X,Y], (X,Y)).
list_and([X|Xs], (X,Rest)) :- list_and(Xs, Rest).
clause_for(Name, Tokens, Predicate) :-
phrase(clause(Parts), Tokens),
list_and(Parts, AndSequence),
Predicate = (Name :- AndSequence).
这基本上可以满足您的需求,但是您需要为谓词提供名称:
?- clause_for(bob, [the,pen,is,on,the,bookshelf,'.',the,pen,is,red,'.'], P).
P = (bob:-on(pen, bookshelf), color(pen, red))
希望这可以帮助!