Простая программа GNU Prolog не работает должным образом

EDIT: я только что скомпилировал gprolog из исходников.

Все работает нормально. Версия 1.4.5 в репозитории Debian содержит ошибки.

Это моя первая программа на GNU Prolog (gprolog) без каких-либо успехов. :-(

Я нашел эти упражнения в учебнике по Prolog.

GNU Prolog 1.4.5 (64 bits)
Compiled Feb  5 2017, 10:30:08 with gcc
By Daniel Diaz
Copyright (C) 1999-2016 Daniel Diaz
compiling /home/aubin/Dev/Prolog/overview/parents.prolog for byte code...
/home/aubin/Dev/Prolog/overview/parents.prolog compiled, 39 lines read - 2555 bytes written, 3 ms
| ?- grandPere( GrandPere, eve ).
uncaught exception: error(existence_error(procedure,pere/0),grandPere/0)
| ?- parent( PereOuMere, eve ).
uncaught exception: error(existence_error(procedure,pere/0),parent/0)
| ?- parents( Pere, Mere, eve).

no
| ?- parents( aubin, muriel, X ).

no
| ?- frere_ou_soeur( X, aubin ).

no
| ?- listing.

% file: /home/aubin/Dev/Prolog/overview/parents.prolog

pere(joseph, michel).
pere(michel, aubin).
pere(michel, brigitte).
pere(michel, sylvie).
pere(alain, muriel).
pere(aubin, eve).

mere(colette, muriel).
mere(muriel, eve).

grandPere(A, B) :-
    pere(A, C),
    pere(C, B).

parent(A, B) :-
    pere(A, B).
parent(A, B) :-
    mere(A, B).

frere_ou_soeur(A, B) :-
    A \= B,
    parent(C, A),
    parent(C, B).

parents(A, B, C) :-
    A \= B,
    A \= C,
    B \= C,
    pere(A, C),
    mere(B, C).

yes

Ожидаемые ответы:

grandPere( GrandPere, eve ). ==> GrandPere = michel
parent( PereOuMere, eve ).   ==> PereOuMere = aubin, PereOuMere = muriel
parents( Pere, Mere, eve).   ==> Pere = aubin, Mere = muriel
parents( aubin, muriel, X ). ==> Enfant = eve
frere_ou_soeur( X, aubin ).  ==> X = brigitte, X = sylvie

Первая строка исходника:

#!/usr/bin/gprolog --consult-file

А призыв такой:

$ gprolog --consult-file parents.prolog 
GNU Prolog 1.4.5 (64 bits)
Compiled Feb  5 2017, 10:30:08 with gcc
By Daniel Diaz
Copyright (C) 1999-2016 Daniel Diaz
compiling /home/aubin/Dev/Prolog/overview/parents.prolog for byte code...
/home/aubin/Dev/Prolog/overview/parents.prolog compiled, 39 lines read - 2555 bytes written, 3 ms
| ?- grandPere( GrandPere, eve ).
uncaught exception: error(existence_error(procedure,pere/0),grandPere/0)
| ?- 

person Aubin    schedule 23.09.2020    source источник


Ответы (1)


Кажется, что вызванный с именем файла, gprolog проверяет его, но не загружает его содержимое в интерпретатор. Чтобы загрузить содержимое файла, вы должны использовать параметр командной строки --consult-file:

$ gprolog --consult-file parents.prolog
GNU Prolog 1.4.5 (64 bits)
Compiled Jul 14 2018, 19:58:18 with clang
By Daniel Diaz
Copyright (C) 1999-2018 Daniel Diaz
compiling /private/tmp/parents.prolog for byte code...
/private/tmp/parents.prolog compiled, 31 lines read - 2474 bytes written, 9 ms
| ?- mere(muriel, eve).

yes
| ?- grandPere( GrandPere, eve ).

GrandPere = michel ?

yes

Прочитайте об использовании gprolog на его странице документации.

person axiac    schedule 23.09.2020
comment
Невероятный! у меня не тот результат. Я завершил свой вопрос, чтобы показать вам различия. - person Aubin; 23.09.2020
comment
У вас новее, чем у меня, даже если версия 1.4.5 у обоих - person Aubin; 23.09.2020
comment
Я только что скомпилировал его из исходников. Это работает нормально. Версия в репозитории Debian содержит ошибки. - person Aubin; 23.09.2020
comment
Я использую версию macOS, установленную с помощью Homebrew. - person axiac; 23.09.2020