Simple error for someone who knows prolog. There is no fullstop to be causing the error - prolog

likes(a,b).
likes(b,d).
likes(c,e).
likes(d,f).
likes(e,h).
likes_trans(X,Y) :- likes(X,Z),likes_trans(Z,Y).
likes_trans(X,Y) :- likes(X,Y).
listfriends(X,R) :- findall(Y,likes_trans(X,Y),R).
likes_both(X,Y,R) := listfriends(X,P), listfriends(Y,S), member(R,P), member(S,P).
Why does the last line 'likes_both' give me the error (when loading the file)
Full stop in clause-body? Cannot redefine
Any suggestions much appreciated, I know I'm missing something fundamental here.

It looks like the := on the last line should be replaced with :-
likes_both(X,Y,R) :- listfriends(X,P), listfriends(Y,S), member(R,P), member(S,P).
/* Here ---------^^ */

Related

How to repair error in Einstein Zebra in prolog >

I have a problem with zebra puzzle.
rightOf(A,B,(B,A,_,_,_)).
rightOf(A,B,(_,B,A,_,_)).
rightOf(A,B,(_,_,B,A,_)).
rightOf(A,B,(_,_,_,B,A)).
middleHouse(A,(_,_,A,_,_)).
firstHouse(A,(A,_,_,_,_)).
nextTo(A,B,(A,B,_,_,_)).
nextTo(A,B,(_,A,B,_,_)).
nextTo(A,B,(_,_,A,B,_)).
nextTo(A,B,(_,_,_,A,B)).
nextTo(A,B,(B,A,_,_,_)).
nextTo(A,B,(_,B,A,_,_)).
nextTo(A,B,(_,_,B,A,_)).
nextTo(A,B,(_,_,_,B,A)).
house[Nationality,Pet,Sport,Drinks,Colour].
zebra_owner(Owner) :-
houses(Houses),
exists(house(Owner,zebra,_,_,_), Houses).
length(5,Houses),
exists(house(british,_,_,_,red),Houses),
exists(house(spanish,dog,_,_,_),Houses),
exists(house(_,_,_,coffe,green),Houses),
exists(house(ukrainian,_,_,tea,_),Houses),
rightOf(house(_,_,_,_,green),house(_,_,_,_,ivory),Houses),
exists(house(_,snail,tennis,_,_),Houses),
exists(house(_,_,chess,_,yellow),Houses),
middleHouse(house(_,_,_,mlik,_),Houses),
firstHouse(house(norwegian,_,_,_,_),Houses),
nextTo(house(_,_,rugby,_,_),house(_,fox,_,_,_),Houses),
nextTo(house(_,_,chess,_,_),house(_,horse,_,_,_),Houses),
exists(house(_,_,volleyball,orangejuice,_),Houses),
exists(house(japanese,_,_,_,_),Houses),
nextTo(house(norwegian,_,_,_,_),house(_,_,_,_,blue),Houses),
nextTo(house(_,_,_,tea,_),house(_,_,_,milo,_),Houses),
exists(house(zebra_owner,zebra,_,_,_),Houses).
Under
house[Nationality,Pet,Smokes,Drinks,Colour].
I see the error: Singleton variables: house[Nationality,Pet,Smokes,Drinks,Colour].
And when I write ?- zebra_owner(Owner)
I see the error: procedure 'houses(A)' does not exist. Reachable from:zebra_owner(A).`
You cannot write
house[Nationality,Pet,Sport,Drinks,Colour].
that's non-existent syntax.
To express that predicate house/1 is valid for list [Nationality,Pet,Sport,Drinks,Colour], write:
house([Nationality,Pet,Sport,Drinks,Colour]).
You also must pay attention to predicate naming: houses/1 is not house/1. Predicate houses/1 is defined nowhere (the error message is wrong, it should really say predicate houses/1 is undeclared).

how to solve the error in this prolog code

What is wrong in this code
frequency(f1).
frequency(f2).
frequency(f3).
allocation(z1,z2,z3,z4,z5,z6,z7,z8) :-
frequency(z1), frequency(z2), frequency(z3), frequency(z4), frequency(z5), frequency(z6), frequency(z7), frequency(z8),
z1\==z2, z1\==z3, z2\==z4, z2\==z3, z3\==z4, z3\==z6, z4\==z5, z4\==z6, z4\==z7, z6\==z7, z6\==z8.
?- allocation(f1,f2,f3,f1,f2,f3,f2,f3).
syntax error: . or operator expected after expression
The following code highlighting should make it clear why the goal allocation(f1,f2,f3,f1,f2,f3,f2,f3) cannot succeed:
allocation(Z1,Z2,Z3,Z4,Z5,Z6,Z7,Z8) :-
dif(Z1,Z2), dif(Z1,Z3),
dif(Z2,Z3), dif(Z2,Z4),
dif(Z3,Z4), dif(Z3,Z6),
dif(Z4,Z5), dif(Z4,Z6), dif(Z4,Z7),
dif(Z6,Z7), dif(Z6,Z8),
maplist(frequency, [Z1,Z2,Z3,Z4,Z5,Z6,Z7,Z8]).
Note the use of dif/2 instead of (\==)/2 in the code above?
prolog-dif preserves logical-purity, for easier debugging!

SWI-Prolog ERROR: No permission to open websocket

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.

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