在SWI-Prolog中实现部分求值

8

我正在编写一个 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是否有内置谓词可以在运行时执行查询的宏展开,就像我在这里尝试的一样?

1
goal_expansion/2? - false
1个回答

6

使用内置的clause/2谓词可以扩展Prolog子句。该谓词像卫生宏一样扩展子句:

:- 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
我还编写了另一个部分求值器,可以递归地扩展目标。在Prolog中还有一些其他的开源部分求值库,例如eccelogen

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