title: Objected Oriented Programming in SWI-Prolog
body: <p>I read somewhere that you can think of modules as objects in Prolog. I am trying to get my head around this, and if it a good way to code.</p>
  
  <p>If I have two files, one defining a class dog and then another one that uses this class to make two dog objects.</p>
  
  <pre><code>:- module(dog,
        [ create_dog/4,bark/1 ]).
  
  create_dog(Name,Age,Type,Dog):-
     Dog = dog(name(Name),age(Age),type(Type)).
  
  bark(Dog):-
     Dog = dog(name(_Name),age(_Age),type(Type)),
     Type = bassethound,
     woof.
  bark(Dog):-
     Dog = dog(name(_Name),age(_Age),type(Type)),
     Type \= bassethound,
     ruff.
  
  woof:-format("woof~n").
  
  ruff:-format("ruff~n").
  </code></pre>
  
  <p>second file</p>
  
  <pre><code>use_module(library(dog)).
  
  run:-
     dog:create_dog('fred',5,bassethound,Dog),
     forall(between(1,5,_X),
         dog:bark(Dog)
        ),
     dog:create_dog('fido',6,bloodhound,Dog2),
     dog:bark(Dog2).
  </code></pre>
  
  <p>This makes a dog object Dog which is a basset hound and makes it bark 5 times,
  I then make another dog object Dog2 which is a bloodhound and make this also bark.  I understand that in oop you have objects that have behaviours and state. So I now have two objects with different behaviours based on their own states but at the moment I am storing the state of the objects in the Dog variables where they can be seen by the code in the main program. Is there a way to hide the state of the objects i.e to have private variables? 
  For example I might want to have a way of storing the state has_barked for each dog object, which would be true if it has barked earlier in the program and false otherwise, then change the behaviour of <code>bark/1</code> based on this.</p>
  
  <p>Also how would you handle inheritance and overriding methods etc? 
  Any pointer to readings welcomed. Thank you.</p>