2017-10-06 12 views
6

Piszę częściową ocenę dla zapytań Prolog. Starałem się rozszerzyć zapytanie korzystając expand_goal/2, ale to po prostu jednoczy Input z Output w tym przypadku:Implementacja częściowej oceny w 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. 

Próbowałem też za pomocą term_expansion/2, ale to powoduje, że program nie:

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

Czy SWI-Prolog ma wbudowany predykat, który może wykonywać makro-ekspansję zapytań w czasie wykonywania, tak jak próbowałem to zrobić tutaj?

Odpowiedz

4

Możliwe jest rozszerzenie klauzuli Prolog za pomocą wbudowanego w clause/2 orzecznika:

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

Ten przykład wypisuje 1<2,3>2.