在prolog中创建动态规则

时间:2014-07-25 11:46:18

标签: prolog erlog

我正在研究Erlog​​系统并尝试创建一些代码以便更好地与erlang记录集成。因此,我希望能够获取记录名称和字段列表,并从中创建序言规则。我想要的是,在erlang中记录了一个名为person的记录,字段,[name,phone]我最终会得到这样的规则

person(name, Person, Name) :- arg(2, Person, Name).
person(phone, Person, Phone):- arg(3, Person, Phone).

这应该很容易发生。所以我想要做的就是创建一个动态命名的新规则。这就是我尝试过的,但它不会编译。

make_access(_, [], _) :-!.
make_access(RecordName, [Field|Rest], Place) :-
    asserta((RecordName(Field,Record,Value) :- arg(Place, Record, Value))),
    N is Place + 1,
    make_access(RecordName, Rest, N).

1 个答案:

答案 0 :(得分:1)

您不能将变量用作仿函数:

RecordName(Field,Record,Value)

相反,您可以构建术语,例如与=..

Rule =.. [RecordName,Field,Record,Value]

=..右侧列表中的第一个元素是该术语的函子,其余的是参数。

然后你可以继续:

asserta((Rule :- arg(Place, Record, Value)))

(如果它符合您的要求,我还没有检查您的示例的其余部分。)