SWI-Prolog ERROR: No permission to open websocket - prolog

I tried the code below and I got:
ERROR: No permission to open websocket `'ws://localhost:9999''.
Why?
If I use root(.), it's ok.
UPDATED (correct code):
:- use_module(library(http/websocket)).
:- use_module(library(http/thread_httpd)).
:- use_module(library(http/http_dispatch)).
:- use_module(library(http/http_path)).
:- use_module(library(http/http_authenticate)).
:- initialization main.
main :-
run.
:- http_handler(root(ws), http_upgrade_to_websocket(echo, []), [spawn([])]).
echo(WebSocket) :-
ws_receive(WebSocket, Message),
( Message.opcode == close
-> true
; ws_send(WebSocket, Message),
echo(WebSocket)
).
run :-
run(9999).
run(Port) :-
http_server(http_dispatch, [port(Port)]).
stop :-
stop(9999).
stop(Port) :-
http_stop_server(Port, []).

In abstract terms, If you use root(X), then this means that the path where this is available is /X.
So, if you specify root(ws), then in your case, you would have to access:
ws://localhost:9999/ws
If you specify root(.) then / suffices etc.
Next time, please specify a complete example, so that others can actually try out your code without having to guess the remainder of your snippet.

Related

Expert system returns this "catch/1" error

Below in code, the representation of a expert system to give response to a pattern of problems in a device (in this case, a mobile one), with the result being the probable cause of the issues, but as you may have seen in the title, this throw a especific error:
go :- catch(Problem),
print("Your problem is probably a"),
print(Problem),
print("Issue"),
nl.
input(Question) :-
write('You have problems such as the follwing:'),
write(Question),
write('?'),
read(output),
nl,
(( output == yes; output == y)
->
assert(yes(Question));
assert(no(Question)), fail).
:- dynamic yes/3, no/1.
verify(Problem):-
(yes(Problem)
-> true;
(no(Problem)
->
fail;
input(Problem))).
undo :- retract(yes(_)),fail.
undo :- retract(no(_)),fail.
undo.
grasp(low_battery) :- low_battery,!.
grasp(software_problem) :- software_problem,!.
grasp(hardware_problem) :- low_battery,!.
%grasp(virus_or_memory_issue) :- virus_or_memory_issue,!.
low_battery :-
verify(phone_not_recharged),
verify(charger_not_working).
software_problem :-
verify(device_turns_on_but_crashes),
verify(some_program_dont_work),
verify(more_than_one_program_crashes_after_awhile),
verify(some_programs_are_not_updated_or_deprecated).
%hardware_problem :-
%verify(device_dont_turn_on),
%verify(device_warmth_frequently),
%verify(screen_exhibits_atipical_visual_patters),
%verify(problems_began_or_intensified_after_fall_or_any_damage).
As a result, the given console is as follows:
ERROR: Unknown procedure: catch/1
ERROR: However, there are definitions for:
ERROR: catch/3
ERROR:
ERROR: In:
ERROR: [11] catch(_4812)
ERROR: [10] go at c:/users/victo/onedrive/documentos/prolog/sistema_especialista.pl:1
ERROR: [9] toplevel_call(user:user:go) at c:/program files/swipl/boot/toplevel.pl:1158
Exception: (11) [user] catch(_4356) ?
Searching for material I've found very little on such matter, and other algoritms I've found were quite not like this one. Any help would be very welcome.

ERROR EXCEPTION while printing message raised: type_error on plunit run_tests

These are defined in chess.pl
:- dynamic drop/1.
:- dynamic start/1.
a_drop(X) :- piese(X), piese_pos(X, Y), \+ on(Y), assertz(drop(X)).
a_pickup(X) :- retract(drop(_-_-X)).
a_clear:- retract(drop(_)).
print_drops:- forall(drop(X), write(X)).
on(X) :- once(drop(_-_-X)).
off(X) :- \+ drop(_-_-X).
I have this test file:
:- begin_tests(chess).
:- include(chess).
clear_board :- a_clear.
board_1_setup :- a_drop(b-r-(b-6)), a_drop(w-k-(d-5)), a_drop(w-b-(c-4)), a_drop(b-b-(b-3)).
test(hello, [
setup(board_1_setup),
cleanup(clear_board)
]) :- on(b-4).
:- end_tests(chess).
When I run this command:
swipl -g run_tests -t halt _chess.plt
This is the output.
% PL-Unit: chess
ERROR:
[[ EXCEPTION while printing message url('/home/eguneys/chess/pro/_chess.plt':10)
with arguments []:
raised: type_error(text,url('/home/eguneys/chess/pro/_chess.plt':10))
]]
:
test hello: failed
done
% 1 test failed
% 0 tests passed
ERROR: -g run_tests: false
I expected the test to fail, but with a friendlier message, what is this ERROR garbage.
Please help.
Tests passes normal when I test for example: ... :- on(b-6).
This seems to be fixed in the development version (ppa:swi-prolog/devel).
There appear to be typos or things missing in your test files:
$ swipl -g run_tests -t halt chess.plt
% PL-Unit: chess
ERROR: /tmp/chess.plt:9:
error in setup: plunit_chess:a_drop/1: Unknown procedure: plunit_chess:piese/1
done
% No tests to run

operator expected in prolog while reading a file

I am getting an error when i tried to read a file as operator expected.
main:-
open('cr1.txt',read,Str),
read_houses(Str,Houses),
close(Str),
write(Houses), nl.
read_houses(Stream,[]):-
at_end_of_stream(Stream).
read_houses(Stream,[X|L]):-
\+ at_end_of_stream(Stream),
read(Stream,X),
read_houses(Stream,L).

I am not sure as to why 'find_identity(X)' is returning as false [Code Below]

Snippets of my code are shown below. After doing a lot of cumbersome tracing, I have reached a point where I think it's the external modules which are the source of my problem, as the findall in links_of_actor never gets called, but links_of_actor itself gets called. I would be very grateful to anyone who can help and can clarify/add more of my code to this question if needed.
find_identity(A) :-
all_actor_links(ALs),
find_identity(ALs,[],A).
find_identity([a(A,_)],_,A).
find_identity(ALs,Ms,A) :-
agent_ask_oracle(oscar,o(1),link,L),
( memberchk(L,Ms) -> find_identity(ALs,Ms,A)
; otherwise -> purge_actors(ALs,L,NewALs),
find_identity(NewALs,[L|Ms],A)
).
links_of_actor(A,Ls) :-
actor(A),
wp(A,WT),
findall(L,wt_link(WT,L),Ls1),
findall(L,link(L),Ls2),
intersection(Ls1,Ls2,Ls).
actor_links(A,a(A,Ls)) :-
links_of_actor(A,Ls).
all_actor_links(ALs) :-
findall(A,actor(A),As),
maplist(actor_links,As,ALs).
----------------------------------------------------- Support Functions ---------------------------------------------------
% wp(Q,WT) <- issue query Q to Wikipedia and return the page in wikitext format
wp(Q,WT):-
wp_cache(Q,WT),!.
wp(Q,WT):-
wp_query2URL(Q,URL),
http_get(URL,R,[]),
atom_json_term(R,RR,[]),
wt_get(RR,WT0),
( atomic_list_concat1(_L,'#REDIRECT',WT0) -> wt_link(WT0,QQ),wp(QQ,WT)
; otherwise -> WT=WT0
),
assert(wp_cache(Q,WT)).
------------------------------------------------------------ Edit ----------------------------------------------------------------
After using the guitracer that is available with prolog, I have found that the program fails at http_get(URL,R,[]) in the wp(Q,WT) predicate. However, I am still not sure as to why this isn't working - Could it be possibly because of my internet?
To clarify, the predicate actor is defined in my file: actor('Billy Bob Thornton'). etc. and so are the links : link('Barack Obama')..
Using these definitions, the error can be localized by adding a # in front of those goals that have to succeed.
...
wp(Q,WT):-
#wp_query2URL(Q,URL),
#http_get(URL,R,[]),
#atom_json_term(R,RR,[]),
#wt_get(RR,WT0),
...
Well, did you try to see if the URL you gave to http_open is actually valid? You can always test from the top-level if you can http_open an URL:
?- use_module(library(http/http_client)).
true.
?- http_open("stackoverflow.com", R, []).
R = % a lot of stuff

Raise an error in SWI Prolog

I'd like to print a message and stop the evaluation of the predicate. How do I do that?
Take a look at this link where the catch/3 and throw/1 mechanisms in Prolog are described.
It is possible to throw an exception or handle an exception using this mechanism.
The example (given on the site) is:
p:- true.
p:- throw(b).
q:- catch(p, B, write('hellop')), r(c).
r(X) :- throw(X).
Then the call:
?- catch(p, X, (write('error from p'), nl)).
will illustrate the ecxeption handling.
I played with a few other examples which I found. This might be usefull.
p :- throw(b).
r(X) :- throw(X).
q:- catch(p, B, format('Output1: Error from throwing p')), r(B).
catch(throw(exit(1)), exit(X), format('Output: `w', [X])).
Output: 1
1 is thrown to catcher 'exit(X)' and recovered by format('Output: ~w', [X])),
catch(p, C, format('hellop')).
Output: hellop
p throws 'b' which is recovered by writing 'hellop'
catch(q, C, format('Output2, Recovering q: helloq ')).
Output1: Error from throwing p
Output2, Recovering q: helloq
Ben
The stderr stream is aliased to user_error (see https://www.swi-prolog.org/pldoc/man?section=streamalias )
You can write a term (like a string) to a stream using write/2.
You can stop the program using halt.
For example:
% Happy case. Comes first, uses ! to avoid taking the alternative branch
foo(X) :- bar(X, Y), baz(Y), !.
% Fallback branch, in case the above failed. Writes a message and halts.
foo(X) :-
write(user_error, "Couldn't foo"),
halt.

Resources