我正在研究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).
答案 0 :(得分:1)
您不能将变量用作仿函数:
RecordName(Field,Record,Value)
相反,您可以构建术语,例如与=..
:
Rule =.. [RecordName,Field,Record,Value]
=..
右侧列表中的第一个元素是该术语的函子,其余的是参数。
然后你可以继续:
asserta((Rule :- arg(Place, Record, Value)))
(如果它符合您的要求,我还没有检查您的示例的其余部分。)