Ho letto da qualche parte che è possibile pensare a moduli come oggetti in Prolog. Sto cercando di capire come funziona, e se è un buon modo per codificare.Programmazione orientata agli oggetti in SWI-Prolog
Se ho due file, uno definisce un cane di classe e poi un altro che usa questa classe per creare due oggetti cane.
:- 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").
secondo file
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).
Questo rende un cane oggetto cane che è un basset hound e la rende abbaiare 5 volte, ho poi fare un altro oggetto cane Dog2 che è un segugio e rendere questo anche abbaiare. Capisco che in oop hai oggetti con comportamenti e stati. Quindi ora ho due oggetti con comportamenti diversi basati sui loro stati ma al momento sto memorizzando lo stato degli oggetti nelle variabili Dog dove possono essere visti dal codice nel programma principale. C'è un modo per nascondere lo stato degli oggetti per avere variabili private? Ad esempio, potrei avere un modo di memorizzare lo stato has_barked per ogni oggetto dog, che sarebbe vero se ha abbaiato prima nel programma e falso in caso contrario, quindi modificare il comportamento di bark/1
in base a ciò.
Inoltre, come gestiresti i metodi di ereditarietà e di sovrascrittura, ecc.? Qualsiasi puntatore alle letture accolto favorevolmente. Grazie.
Se non è la risposta che vuoi, proverò a scriverne una più lunga, ma ... penso che tu stia cercando di usare Prolog per gli scopi sbagliati. È un motore logico, non un linguaggio OOP. Il problema sarebbe risolto molto più semplicemente in un linguaggio imperativo/OOP come Python o Java. – Tom
Sto solo sperimentando. Questo è solo un esempio banale, ho un sacco di codice prolog e mi chiedo se usare uno stile combinato di oop e logica sarà un buon modo di fare le cose o no .. felice di sentire i tuoi pensieri, capisco come programmare in Java e python quindi ho familiarità con lo standard oop ma non oop in prolog. – user27815
Penso che l'importante considerazione da notare è che l'OOP è un paradigma, e lo è anche la programmazione logica. In Prolog, non penso che si mescolino particolarmente bene. Se vuoi _ per unire le due discipline, considera un pacchetto come questo: https://code.google.com/p/pyswip/ – Tom