1

I have the following situation, I have to make a predicate that represents a doctor attending a patient, but it does not work.

doctor(adele).
doctor(inez).
doctor(elin).

patient(aurora).
patient(mandy).
patient(roan).

doctor_attends_patient(doc,pat):-doctor(doc),patient(pat).

When making the query returns false.

doctor_attends_patient(adele,roan).
false
Vale
  • 13
  • 5

1 Answers1

0

As was said before, predicates can be read as

to_prove(This) :- need_to_prove(This) , and_also(That).

so

doctor_attends_patient(doc, pat) :- doctor(doc), patient(pat).

means that to prove

doctor_attends_patient(doc, pat)

Prolog needs to prove

                                    doctor(doc), patient(pat).

Both of these sub-goals are ground, do not contain any logical Variables, so to be proven they must match some fact(s) in our knowledge base. But we only have

doctor(adele).
doctor(inez).
doctor(elin).

patient(aurora).
patient(mandy).
patient(roan).

We do not have doctor(doc) nor patient(pat) as stated facts.

doctor(Doc) on the other hand, would match any of the stated doctor/1 facts, because Doc is a logical variable able to assume any value.

As Daniel Lyons points in the comments, variable names are Capitalized, in Prolog.

You can now fix your predicate definition.


As to your query,

doctor_attends_patient(adele,roan)

also does not match any facts nor rule heads in your knowledge base. The only rule with remotely matching head you have is

doctor_attends_patient(doc, pat) :- doctor(doc), patient(pat).

but the compound term

doctor_attends_patient( adele, roan)

does not match the compound term

doctor_attends_patient( doc  , pat )

because though the functors of both terms, doctor_attends_patient, do match, and their arities, 2, match also, none of the arguments inside the parentheses match. In particular,

    adele = doc

fails, and also

    roan = pat

would also fail, if tried.

But if you were using variables, then

    adele = Doc , roan = Pat

would instead succeed, resulting in a substitution Doc = adele , Pat = roan. Since the rule's head would then match too, as a whole,

doctor_attends_patient(adele,roan)
doctor_attends_patient( Doc , Pat)

the rule's body would be entered, and Prolog would try to prove the resulting sub-goals after substituting any variables therein with their values in the successful substitution.

You can now fix your predicate definition.

Will Ness
  • 70,110
  • 9
  • 98
  • 181