Prolog从原子构建规则

时间:2014-08-07 13:53:19

标签: prolog tokenize

我正在尝试通过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.

我不需要任何超级幻想,因为我的输入将始终遵循一些规则,因此只需要根据这些规则进行分析。

我一直在考虑这个问题大约一个小时了,但是没有达到相当可观的程度,所以我无法向你提供迄今为止我尝试过的东西。任何人都可以把我推向正确的方向吗?

3 个答案:

答案 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条款),或者另一种方式。以下是我推荐的两个介绍: