Prolog procedure does not exist (cant run rules in prolog) - prolog

I am new to Prolog and using the SWISH SWI online PROLOG website. https://swish.swi-prolog.org/
I am trying a really basic program:
a('jae').
b('lii').
c('jackson').
happy(A):-sings(A).
happy(B):-dances(B).
goToPlay(C):-free(C).
trying to run happy(jae). gives the following error
procedure `sings(A)' does not exist
Reachable from:
happy(A)
Please help me solve this.

If submit the goal
happy(jae).
Then rule
happy(A) :- sings(A).
applies, which means that the next goal to be solved is
sings(A).
with A = jae.
Unfortunately the one-argument predicate sings/1 is nowhere to be found, so you get the same error as for a missing procedure in another programming language.
You have to define sings/1.

Related

prolog how does a built in predicate get an existence_error?

so I have a prolog assignment that has to be tested with search algorithms provided by the teacher but I keep getting this error:
uncaught exception: error(existence_error(procedure,op/4),findall/3)
which I don't understand because op/4 and findall/3 are built in predicates, right? So how could they not exist?
Anyone has any advice on getting over this? Thanks

Prolog ERROR: Undefined procedure: transpose/2 (DWIM could not correct goal)

I have just started with Prolog for one of my classes so it's quite basic. I just had a doubt that does Prolog not have any inbuilt functions that can be used directly or should we always be writing a set of facts and rules first and then use them? I was trying to run this function:
?-transpose([[1,2,3],[4,5,6],[7,8,9]],Ts).
Which gave me this error:
ERROR: Undefined procedure: transpose/2 (DWIM could not correct goal)
So, basically, my question is, do I need to write how the transpose would work? I thought it was an inbuilt function ready to use.
P.S.: I am using: SWI-Prolog (threaded, 64 bits, version 7.6.0-rc1)
Of course it has quite a few built-in predicates (listed in http://www.swi-prolog.org/pldoc/man?section=builtin) but transpose is not one of them. If it's "for one of my classes so it's quite basic", most likely you are expected to write transpose yourself, especially if it's your first Prolog class.
There is one in clfpd library, see How to use predicate transpose in SWI-Prolog?.

prolog sort/4 undefined procedure built in

I am trying to use a supposedly built in procedure in SWI-Prolog.
The procedure in question is sort/4.
The thing is, when I try to use it in my program I get the following error:
ERROR: Undefined procedure: sort/4
ERROR: However, there are definitions for:
ERROR: msort/2
ERROR: sort/2
I don't understand because the documentation says its built-in, but Prolog doesn't know it. I really need to use this procedure
Would you know how to fix this issue ? I thought it was a matter of library and tried to add ":- use_module(library(lists))." at the beginning of my code but the situation remains the same.
Hope you can help me, have a good day
The sort/4 predicate as documented here is relatively new. If you get the latest stable or development version of SWI-Prolog it should be available. It is a built-in, not a part of a library.

Is there a clpfd library in YAP Prolog equivalent to the one in SWI-Prolog?

I wrote this code in SWI-Prolog using the clpfd module but when porting to YAP I found that the cumulative/2 predicate is unavailable according to the error message given in the shell. So, I tried to look online for clpfd documentation but found almost nothing.
> EXISTENCE ERROR- procedure cumulative/2 is undefined, called from
> context prolog:$command/4
> Goal was user:cumulative([task(_D543,5,_D539,6,_131120),task(_D535,5,_D531,6,_131128),task(_D527,6,_D523,8,_131136),task(_D519,10,_D515,4,_131144),task(_D511,3,_D507,5,_131152),task(_D503,5,_D499,5,_131160),task(_D495,4,_D491,5,_131168),task(_D487,1,_D483,7,_131176)],[limit(15)])
The module clpfd somehow imported without error.

Prolog helloWorld not working

Silly question, but I'm trying to get this simple Prolog program working. I have written other small Prolog programs with no problem, but this one is giving me trouble:
test :- write 'test1234 test1234',nl,halt.
That's it. The file is saved as adventure1.pl. It is loaded into SWI-Prolog on Ubuntu with the command line option:
prolog -s adventure1.pl
When loaded into the Prolog interpreter I enter the following:
start.
However, Prolog says undefined procedure: test/0 (DWIM could not correct goal). What is the error here, is it somthing really simple. I wrote this because I have example programs that use a predecate named start which displays text, yet I can't even get this to work.
write 'test1234 test1234'
is a syntax error, as SWI-Prolog clearly indicates:
ERROR: /tmp/adventure1.pl:2:10: Syntax error: Operator expected
It should be
write('test1234 test1234')
(Of course, that won't solve the problem of start not working, because you've defined test.)

Resources