Вопрос

Я хотел бы выбрать факториал число. Мое факториальное правило находится в файле Prolog, и я подключаю его к файлу C ++. Может кто-нибудь, пожалуйста, скажите мне, что не так с моим взаимодействием C ++ к прологе?

my factorial.pl file:

factorial( 1, 1 ):-
    !.
factorial( X, Fac ):-
    X > 1,
    Y is X - 1,
    factorial( Y, New_Fac ),
    Fac is X * New_Fac.



my factorial.cpp file:

headerfiles

term_t tf;
term_t tx;
term_t goal_term;
functor_t goal_functor;

int main( int argc, char** argv )
{
    argv[0] = "libpl.dll";

    PL_initialise(argc, argv);

    PlCall( "consult('factorial.pl')" );

    cout << "Enter your factorial number: ";
    long nf;
    cin >> nf;

    tf = PL_new_term_ref();
    PL_put_integer( tf, nf );
    tx = PL_new_term_ref();

    goal_term = PL_new_term_ref();
    goal_functor = PL_new_functor( PL_new_atom("factorial"), 2 );
    rval = PL_cons_functor( goal_term, goal_functor, tf, tx );

    PL_halt( PL_toplevel() ? 0 : 1 );
}

Я получаю правильную подсказку, что делает последнюю строчку. Но я не получаю результат факториального расчета, например:

?-  factorial( 5, X ).
X = 120
true

Что мне не хватает?

Спасибо,

Это было полезно?

Решение 2

# include files

term_t tf;
term_t tx;
term_t goal_term;
functor_t goal_functor;

int main( int argc, char** argv )
{
    argv[0] = "libpl.dll";
    PL_initialise( argc, argv );

    PlCall( "consult( swi( 'plwin.rc' ) )" );
    PlCall( "consult( 'factorial.pl' )" );

    cout << " Enter your factorial number: ";
    long nf;
    cin >> nf;

    tf = PL_new_term_ref();
    PL_put_integer( tf, nf );
    tx = PL_new_term_ref();
    goal_term = PL_new_term_ref();
    goal_functor = PL_new_functor( PL_new_atom("factorial"), 2 );
    PL_cons_functor( goal_term, goal_functor, tf, tx );

    int fact;
    if( PL_call(goal_term, NULL) )
        {
            PL_get_integer( tx, &fact );
            cout << fact << endl;
        }
    else
        {
            PL_fail;
        }

    PL_halt( PL_toplevel() ? 0 : 1 );
}

Другие советы

Я не все, что знакомо с мостом Swi Prolog-C / C ++, но кажется, что вы не инициируете запрос, как только вы определяете условия. Вам нужно использовать PL_call или PL_open_query а затем распечатайте результат, прежде чем передавать вещи на Swi-Prolog.

    PL_cons_functor( goal_term, goal_functor, tf, tx );
int nfactorial;
if (PL_call(goal_term, NULL)) {
    PL_get_integer(tx, &nfactorial);
    std::cout << "X = " << nfactorial << " ." << std::endl;
} else {
    PL_fail;
}
    PL_halt( PL_toplevel() ? 0 : 1 );

Я не знаю, если вы можете установить goal_term как запрос верхнего уровня. Если вы хотите, чтобы запрос был запущен по вызову PL_toplevel, вы можете построить запрос как строку и пройти его как аргумент «-T» в векторе аргумента PL_initialize.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top