GNU Prolog 编译前的术语展开

3

考虑以下指令和谓词的元组:

:- web_resource(plaintext/1, [content_type(text/plain)]).
plaintext(Result) :-
    ...code...

我该如何告诉 gplc 将这段代码转换为什么?
plaintext([headers(['Content-Type'-'text/plain']),
           payload(Payload)]) :-
    old_plaintext(Payload).

old_plaintext(Payload) :-
    ...code...

在编译之前?old_payload可以进行递归定义。


我认为你也可以使用断言和撤回谓词。 - damianodamiano
1个回答

1

GNU Prolog的term-expansion功能目前有限。但是您可以使用支持GNU Prolog的Logtalk term-expansion机制来实现该转换。简而言之,定义一个带有扩展规则的Logtalk hook object对象,然后通过使用logtalk_compile/2谓词来扩展您的Prolog源文件。类似于:

:- object(my_expansion,
    implements(expading)).

    term_expansion((:- web_resource(Name/Arity, Headers) Clauses) :-
        % construct clauses
        ...

:- end_object.

然后:

$ gplgt
...
| ?- {my_expansion}.
...

| ?- logtalk_compile('my_source_file.pl', [hook(my_expansion), scratch_directory('.']).
...

最后一个查询将生成一个新的Prolog文件,其中包含扩展结果,并保存在当前目录中。您可以像往常一样使用gplc编译此文件。有关可移植Logtalk术语扩展机制的更多详细信息,请参见:https://logtalk.org/manuals/userman/expansion.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接