mortacious / pyswip-notebook

SWI-Prolog useable from notebooks.
MIT License
1 stars 0 forks source link

example.ipynb #1

Open martinklein opened 2 years ago

martinklein commented 2 years ago

Im Beispiel example.ipynb in der zweiten Zelle gibt es das Statement

for l in prolog.query("listing"): print(l)

Bei mir ist das Resultat aber nicht die Liste aller Facts Sondern nur

{}

Bitte um Ihre Hilfe Martin Klein

mortacious commented 2 years ago

Ich habe es gerade noch mal unter Linux mit SWI-Prolog 8.4.1 getestet und das erwartete Ergebnis bekommen:

female(rhea).
female(hestia).
female(hera).
female(demeter).
female(athena).
female(hebe).
female(persephone).

parent(cronus, hestia).
...
parent(demeter, persephone).

male(cronus).
male(pluto).
male(poseidon).
male(zeus).
male(ares).
male(hephaestus).
{}

Ich habe 2 Vermutungen woran es liegen könnte:

  1. Welches Betriebssystem wurde zum Testen genommen? Der String-Input für consult funktioniert über eine temporäre Datei, die von Prolog wieder geladen wird. Windows-Systeme haben damit Erfahrungsgemäß oft Probleme. Versuchen Sie einmal die Fakten zunächst direkt in eine Datei zu schreiben und danach mit consult zu laden:
facts = """
parent(cronus,hestia).
parent(cronus,pluto).
parent(cronus,poseidon).
parent(cronus,zeus).
parent(cronus,hera).
parent(cronus,demeter).
parent(rhea, hestia).
parent(rhea, pluto).
parent(rhea, poseidon).
parent(rhea, zeus).
parent(rhea, hera).
parent(rhea, demeter).

parent(zeus, athena).

parent(zeus, ares).
parent(zeus, hebe).
parent(zeus, hephaestus).
parent(hera, ares).
parent(hera, hebe).
parent(hera, hephaestus).

parent(zeus, persephone).
parent(demeter, persephone).

male(cronus).
male(pluto).
male(poseidon).
male(zeus).
male(ares).
male(hephaestus).
female(rhea).
female(hestia).
female(hera).
female(demeter).
female(athena).
female(hebe).
female(persephone).
"""
with open("test_facts.pl", "w") as f:
    f.write(facts)

prolog.consult("test_facts.pl") 
  1. Funktionieren denn die anderen Notebook-Zellen darunter wie erwartet? Dann könnte es ein Problem mit der listing-Funktion in Prolog selbst sein.
martinklein commented 2 years ago

Ach ja sorry ich habe es unter Windows 11 mit SWI-Prolog 8.4.2 getestet. Die anderen Zellen darunter funktionieren alle. Auch mit ihrem workaround tritt dasselbe Problem auf.

for l in prolog.query("listing"): print(l) {}

Es muss also wirklich ein Problem mit der listing Funktion in Prolog sein.

mortacious commented 2 years ago

Möglicherweise wird die listing-Library unter Windows nicht standardmäßig importiert. Hilft es vor der query

prolog.assertz("use_module(library(listing))")

auszuführen?

martinklein commented 2 years ago

----> 2 prolog.assertz("use_module(library(listing))") 3 for l in prolog.query("listing"): 4 print(l)

NameError: name 'prolog' is not defined

martinklein commented 2 years ago

Sorry - hatte die Zelle davor nicht gestartet. Aber jetzt - leider keine Änderung:

prolog.assertz("use_module(library(listing))") for l in prolog.query("listing"): print(l)

{}

mortacious commented 2 years ago

Funktioniert listing` denn eigentlich direkt im Prolog-Interpreter?

martinklein commented 2 years ago

Ja - funktioniert: 1 ?- fb:consult(planets). true.

2 ?- fb:listing.

orbits(earth, sun). orbits(saturn, sun). orbits(titan, saturn).

satellite(X) :- orbits(X, _).

planet(X) :- orbits(X, sun).

moon(X) :- orbits(X, Y), planet(Y). true.