I can’t help with the (presumably) pyswip issue above, but I can validate that the swiplserver Python library (the Python library that uses the MQI interface that @jan mentions) works well in a Flask application. That’s how I’ve been using it.
Ok, Thank you I will modify the code to try this library.
Hello Again,
I couldn’t install this swipl. What is the correct repository link? I would appreciate if you can share…
Kind Regards,
Ferda
On the prolog side you don’t have to install anything, it is included in the latest SWI-Prolog version. Make sure to use the development version (8.5.3), which has recent fixes.
Hi,
I do not want to deal with building etc. now. The latest windows installer has the version 8.4.1.1. Is it ok?
Kind Regards,
Ferda
To be more specific, that is the stable version. https://www.swi-prolog.org/download/stable
The installation, not build, for the Windows development version can be found at https://www.swi-prolog.org/download/devel which is currently at 8.5.3-1.
For an even more recent Windows version, is the nightly build found at https://www.swi-prolog.org/download/daily/bin/
This is also documented at
Install SWI-Prolog development version on Windows 10
HTH
Hello,
How do we consult with swiplserver. I couldn’t see a sample?
Thanks in advance.
Ferda
Maybe it is just me but this statement has me confused.
To me it could mean 1 of 2 different things.
To consult a Prolog source code file from the top level, see Getting started quickly
To access a page from an SWI-Prolog web server just access the page like any others.
Typically the server will run locally and use a specific port, e.g. 8080
, and have an index.html
page. So using your favorite web browser the URL would be http://localhost:8080/index.html
Hi Eric,
Thanks for the quick response. I am relatively new to the terminology, so I may be asking in a confusing way. Sorry for that.
What I was asking is the equivalent of prolog.consult (pl_file_name_and_path) (where prolog is type of Prolog class) in this system.
I assume I would do this with exec in python but not sure.
How about the assertz function? Cause part of (static ones) my prolog definitions are in a pl file, but for part of them (dynamic ones depending on user input), I was using the assertz function to extend the initial definitions. I do all of this stuff as a part of initializing prolog in my system. Later, I do the queries…
I would appreciate if you can provide more detailed examples on how to use the pl file and how to do the assertz with this new swiplserver in python? I think the query part is relatively more straightforward.
Kind Regards,
Ferda
Hi Eric,
As I described in my initial question, my prolog code and my interaction with it via python works well without the web interface, but has problem (access violation) when accessed via web. So, I need to have a sample working not on the command line but via python and swiplserver. Unfortunately, the getting starting guide does not provide an answer to my query. I have been trying to solve this problem using only the pyswip for a while now with no result.
I understand that swiplserver package solves this problem, but I still can not understand how to use it properly. I can not find the functions that are necessary for my solution, basically assertz and consult. I am assuming query would work in a similar way pyswip. Couldn’t try it yet due to not passing the initialization phase… Hopefully you can help me to learn to use this new package?
Kind Regards,
Ferda
Did you read the documentation here: swiplserver · PyPI and here: swiplserver.prologmqi API documentation?
It seems rather simple python code:
from swiplserver import PrologMQI, PrologThread
with PrologMQI() as mqi:
with mqi.create_thread() as prolog_thread:
result = prolog_thread.query("member(X, [color(blue), color(red)])")
print(result)
EDIT: seems to me you just replace "member[X, ...]"
with consult(...)
or assertz(...)
.
After seeing links by SWI it now makes sense.
mqi is only a few months old and I have not used it yet, thus my confustion.
To make the terms mqi and swiplserver easier to understand when used in a topic here have added them as linkify terms. (ref)
If you look at the use of the term in earlier replies you will see that they have all magickly turned into links.
Thanks for the response. I tried to replace with consult now. Now I am getting the below error which seems to be related to configuration of MQServer.
I saw some
site-packages\swiplserver\prologmqi.py", line 428, in start
raise PrologLaunchError("no port found in stdout")
swiplserver.prologmqi.PrologLaunchError: no port found in stdout
I tried to run the below command with and without the halt hoping to have a running mq server but it didn’t help.
Please tell me what I am doing wrong?
Run the folowing
$ swipl --quiet -g mqi_start -t halt -- --write_connection_values=true
You should see some output like:
38515
149542373205988535753366437482310558445
The first number is the port.
If you don’t see the numbers, there is your problem.
Hi Again,
I was thinking MQI as a self starter. However, it didn’t in my case. Getting the MQI start error port not found, I decided to execute the below command hoping to start it manually.
> os.system("swipl -s ./mqi.pl -g \"mqi:install_to_library('./mqi.pl')\" ")
When I look at the python requirements, there is not much. I added the lib and library folders for both swi-prolog and swipl to the path. Anyway, I am not sure why I am getting this error. I am still at the step where I am trying to switch the member statement with consult (From one of the above messages).
ERROR: d:/my_project_path/python/mqi.pl:109:
ERROR: source_sinklibrary(socket)' does not exist Warning: d:/my_project_path/python/mqi.pl:109: Warning: Goal (directive) failed: mqi:use_module(library(socket)) ERROR: d:/my_project_path/python/mqi.pl:110: ERROR: source_sink
library(http/json)’ does not exist
Warning: d:/my_project_path/python/mqi.pl:110:
Warning: Goal (directive) failed: mqi:use_module(library(http/json))
ERROR: d:/my_project_path/python/mqi.pl:111:
ERROR: source_sinklibrary(http/json_convert)' does not exist Warning: d:/my_project_path/python/mqi.pl:111: Warning: Goal (directive) failed: mqi:use_module(library(http/json_convert)) ERROR: d:/my_project_path/python/mqi.pl:113: ERROR: source_sink
library(term_to_json)’ does not exist
Warning: d:/my_project_path/python/mqi.pl:113:
Warning: Goal (directive) failed: mqi:use_module(library(term_to_json))
ERROR: d:/my_project_path/python/mqi.pl:115:
ERROR: source_sinklibrary(filesex)' does not exist Warning: d:/my_project_path/python/mqi.pl:115: Warning: Goal (directive) failed: mqi:use_module(library(filesex)) ERROR: d:/my_project_path/python/mqi.pl:121: ERROR: source_sink
library(time)’ does not exist
Warning: d:/my_project_path/python/mqi.pl:121:
Warning: Goal (directive) failed: mqi:use_module(library(time))
ERROR: d:/my_project_path/python/mqi.pl:122:
ERROR: source_sink `library(uuid)’ does not exist
Warning: d:/my_project_path/python/mqi.pl:122:
Warning: Goal (directive) failed: mqi:use_module(library(uuid))
ERROR: -g mqi:install_to_library(’./mqi.pl’): mqi:install_to_library/1: Unknown procedure: mqi:copy_file/2
I get the below error
ERROR: -g mqi_start: catch/3: Unknown procedure: mqi_start/0
What does
swipl --version
return?
SWI-Prolog version 8.3.27 for x64-win64
You have an old version. Please uninstall it first, and then install the new version from here:
https://www.swi-prolog.org/download/devel/bin/swipl-8.5.3-1.x64.exe.envelope
Check the box “I understand” and download the binary.
Make sure to uninstall the old version first.
Then run
$ swipl --quiet -g mqi_start -t halt -- --write_connection_values=true
To make sure you are getting a port.
please erase any mqi.pl file that you have downloaded; start with a clean environment.
Hi,
The line where I call the consult statement works now.
I am getting error in the assertz call…
with PrologMQI(port=4242, password="debugnow") as mqi:
mqi.start()
with mqi.create_thread() as prolog_thread:
prolog_thread.query("consult(\'./graph_traversal.pl\')")
print("AAA")
for edge in selected_graph_attack_paths:
command = "assertz(\"arc('" + edge[0] + "','" + edge[1] + "')\")"
print(command)
prolog_thread.query(command)
print("BBB")
{ “args”: [ {“args”: [“callable”, “arc(‘A’,‘1’)” ], “functor”:“type_error”} ], “functor”:“exception” }