Prolog 从原子构建规则

Pad*_*rom 5 prolog tokenize

我目前正在尝试通过 Prolog 解释用户输入的字符串。我正在使用我在互联网上找到的代码,它将字符串转换为原子列表。

"Men are stupid." => [men,are,stupid,'.'] % Example
Run Code Online (Sandbox Code Playgroud)

由此我想创建一个规则,然后可以在 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.
Run Code Online (Sandbox Code Playgroud)

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

我已经考虑了大约一个小时,但没有想到任何重要的事情,所以我无法向您提供我迄今为止尝试过的内容。谁能把我推向正确的方向?

mat*_*mat 5

考虑使用 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] }.
Run Code Online (Sandbox Code Playgroud)

例子:

?-  list_clause([men,are,stupid], Clause).
Clause = stupid(men).

?- list_clause([everyone,who,is,stupid,is,tall], Clause).
Clause = tall(_G2763):-stupid(_G2763).
Run Code Online (Sandbox Code Playgroud)

我把剩下的例子作为一个简单的练习。

您可以使用assertz/1动态断言此类子句:

?- List = <your list>, list_clause(List, Clause), assertz(Clause).
Run Code Online (Sandbox Code Playgroud)