2017-10-06 199 views
6

我正在为Prolog查询编写一个部分评估器。我试图扩大使用expand_goal/2查询,但它只是在这种情况下,Output统一了Input在SWI-Prolog中实现部分评估

:- 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是否有内置的谓词,可以在运行时执行查询的宏扩展,正如我在此尝试的那样?

回答

4

有可能使用扩大Prolog的条款内置clause/2谓:

:- 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