我正在尝试通过Prolog解释用户输入的字符串。我正在使用我在互联网上找到的代码,它将字符串转换为原子列表。
"Men are stupid." => [men,are,stupid,'.'] % Example
由此我想创建一个规则,然后可以在Prolog命令行中使用。
% everyone is a keyword for a rule. If the list doesn't contain 'everyone'
% it's a fact.
% [men,are,stupid]
% should become ...
stupid(men).
% [everyone,who,is,stupid,is,tall]
% should become ...
tall(X) :- stupid(X).
% [everyone,who,is,not,tall,is,green]
% should become ...
green(X) :- not(tall(X)).
% Therefore, this query should return true/yes:
?- green(women).
true.
我不需要任何超级幻想,因为我的输入将始终遵循一些规则,因此只需要根据这些规则进行分析。
我一直在考虑这个问题大约一个小时了,但是没有达到相当可观的程度,所以我无法向你提供迄今为止我尝试过的东西。任何人都可以把我推向正确的方向吗?
答案 0 :(得分:4)
考虑使用DCG。例如:
list_clause(List, Clause) :-
phrase(clause_(Clause), List).
clause_(Fact) --> [X,are,Y], { Fact =.. [Y,X] }.
clause_(Head :- Body) --> [everyone,who,is,B,is,A],
{ Head =.. [A,X], Body =.. [B,X] }.
示例:
?- list_clause([men,are,stupid], Clause).
Clause = stupid(men).
?- list_clause([everyone,who,is,stupid,is,tall], Clause).
Clause = tall(_G2763):-stupid(_G2763).
我将剩下的例子作为一个简单的练习。
您可以使用assertz/1
动态声明此类子句:
?- List = <your list>, list_clause(List, Clause), assertz(Clause).
答案 1 :(得分:2)
首先,您可以在标记化步骤中创建术语而不是列表,甚至直接将规则断言到数据库中。让我们来看看男人是傻瓜&#34;示例
你想写下以下内容:
?- assert_rule_from_sentence("Men are stupid.").
并最终使用stupid(men).
assert_rule_from_sentence(Sentence) :-
phrase(sentence_to_database, Sentence).
sentence_to_database -->
subject(Subject), " ",
"are", " ",
object(Object), " ",
{ Rule =.. [Object, Subject],
assertz(Rule)
}.
(让我们假设您知道如何为主题和对象编写DCG)
就是这样!当然,你的sentence_to_database//0
需要有更多的子句,或者使用辅助子句和谓词,但这至少是一个开始。
正如@mat所说,首先标记化然后处理标记化句子更清晰。但是,它会是这样的:
tokenize_sentence(be(Subject, Object)) -->
subject(Subject), space,
be, !,
object(Object), end.
(现在你还需要定义句子的空格和结尾......)
be -->
"is".
be -->
"are".
assert_tokenized(be(Subject, Object)) :-
Fact =.. [Object, Subject],
assertz(Fact).
这样做的主要原因是你在标记化过程中知道你有什么样的句子:主语 - 动词 - 宾语,或主语 - 修饰语 - 宾语 - 修饰符等,你可以用这些信息来写你的assert_tokenized/1
以更明确的方式。
答案 2 :(得分:1)
Definite Clause Grammars 是Prolog的首选工具,用于将字符串(例如英语句子)翻译成Prolog术语(例如您想要生成的Prolog条款),或者另一种方式。以下是我推荐的两个介绍: