gpt4 book ai didi

swi-prolog - 在 SWI-Prolog 中实现部分评估

转载 作者:行者123 更新时间:2023-12-04 12:28:03 28 4
gpt4 key购买 nike

我正在为 Prolog 查询编写一个部分评估器。我尝试使用 expand_goal/2 扩展查询,但它只是统一了 InputOutput在这种情况下:

:- initialization(main).
main :-
Input=is_between(1,A,3),expand_goal(Input,Output),writeln(Output).
is_between(A,B,C) :-
B>A,B<C.

我也尝试使用 term_expansion/2 ,但这会导致程序失败:
:- initialization(main).
main :-
Input=is_between(1,A,3),term_expansion(Input,Output),writeln(Output).
is_between(A,B,C) :-
B>A,B<C.

SWI-Prolog 是否有一个内置谓词可以在运行时执行查询的宏扩展,就像我在这里尝试做的那样?

最佳答案

可以使用内置 clause/2 扩展 Prolog 子句谓词。这个谓词像 hygienic macro 一样扩展子句:

:- initialization(main).
main :- clause(is_between(1,2,3),B),writeln(B).
is_between(A,B,C) :- A<B,C>B.

此示例打印 1<2,3>2 .

可以使用 findall/3 扩展多个子句谓词:
:- initialization(main).
main :- find_all_clauses(is_between(1,2,3),B),writeln(B).

find_all_clauses(Predicate,Output) :-
findall(Predicate1,clause(Predicate,Predicate1),Output1),
list_to_disjunction(Output1,Output).

list_to_disjunction([A],A).
list_to_disjunction([A|B],(A;B1)) :- list_to_disjunction(B,B1).

is_between(A,B,C) :- A<B,C>B.
is_between(A,B,C) :- B>A,B<C.

此示例打印 1<2,3>2;2>1,2<3 .

我也写了 another partial evaluator递归地扩展目标。 Prolog 中还有其他一些用于部分评估的开源库,例如 eccelogen .

关于swi-prolog - 在 SWI-Prolog 中实现部分评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46614561/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com