[alg/prolog] info over metadata.*

Pagina: 1
Acties:

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Ik ben op dit moment bezig met een kleine prolog interpreter waarbij het de bedoeling is dat de oplossingen die gegenereerd worden, weer benaderd kunnen worden als terms op een hoger nivo. Als je dus een prolog programma draait, kan de uitkomt hiervan weer dienen als input voor het volgende prolog programma. Dit is technisch gezien niet zo`n probleem. Het zou verder wel handig zijn om ook metadata mee te nemen om het lagere nivo, zodat je dit bv op een hoger nivo weer kan aanspreken.

vb:
code:
1
2
3
4
5
6
7
8
9
if moord_gepleegd then schuldig
    @instantie(rechtbank);
    
if moord_gepleegd en toerekeningsvatbaar then schuldig
    @instantie(hoger_gerechtshof);
    
meta regel:

beste_uitspraak(conclusie(schuldig,@instantie(hoger_gerechtshof))));


[edit]
Dit is alleen voor het idee, correct het niet.

Ik zit dus alleen even met die metadata. Ik kan kan me wel een paar simpele toepassingen voor de geest halen, maar ik zou liever zien dat ik wat literatuur voor handen kan krijgen zodat ik hier iets meer over weet. Dus wie kan me literatuur aanraden over metadata?

ps:
Ik weet van het bestaan van attributen in java/.net.

[ Voor 21% gewijzigd door Alarmnummer op 28-11-2003 12:44 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
*kick*

Zijn er geen prolog mensen hier??

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 24-05 20:08
Heb 2 jaar geleden eea met Prolog gedaan. Alleen wat je wilt weten is me niet echt duidelijk. (en het zit er goed in dat ik geen antwoord voor je heb, als ik je vraag al niet begrijp :) )

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Wat ik wil is meta kennis (maw dus kennis over de kennis) meenemen.

Het is de bedoeling dat er bij het bewijzen van een bepaalde hypothese allerlei informatie hierover wordt meegenomen, bv op welke manier het is vastgesteld, wat eraan vooraf is gegaan (dus andere regels die geprobeerd zijn), en welke termen hiervoor geevalueerd moesten worden (dit kan recursief plaatsvinden)

Deze informatie over de conclusie kan je zien als een hele grote datastructuur, en het is de bedoeling dat die datastructuur later weer ingelezen kan worden (in een meta redeneer bestand).

voorbeeld.
Afbeeldingslocatie: http://rint.rechten.rug.nl/images/peter/sh4.jpg
Afbeeldingslocatie: http://rint.rechten.rug.nl/images/peter/sh5.jpg

Het bij prolog mogelijk dat je meerdere oplossingen krijgt, dus je krijgt op hoger nivo een lijst met verzamelingen binnen. Het is dan de bedoeling dat er weer over deze data structuur wordt geredeneerd. Ik zou bv alle oplossingen willen verwerpen die niet aan een bepaalde voorwaarde voldoen, of die minder interessant zijn. Deze regels het dan meta regels.

Om iets met deze meta regels te doen, is het handig om meta kennis mee te nemen bij bv rules.

code:
1
2
schuldig(P):-moord_gepleegd(P)
      metadata instantie_die_uitspraak_heeft_gedaan = rechtbank,


Je zou dan een meta regel kunnen invoeren die alle conclusies verwerpt die door een rechtbank zijn gedaan.

[ Voor 6% gewijzigd door Alarmnummer op 01-12-2003 16:08 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Ik heb nog even zitten denken over die metadata, en het mechanisme kan enorm eenvoudig zijn.

vb:

code:
1
2
schuldig(P):-moord_gepleegd(P)
     @instantie(rechtbank)


De metadata dat een de rechtbank de instantie is die deze uitspraak doet kan je ook zien als een fact:

code:
1
@instantie(schuldig(P):-moord_gepleegd(P),rechtbank).


Het werken met metadata introduceert niet eens een nieuw oplosmechanisme , omdat het zelf ook gewoon weer een fact is. Dat is gelukkig een pak van mijn hart omdat het unificatie mechanisme lekker simpel blijft.

[ Voor 17% gewijzigd door Alarmnummer op 02-12-2003 09:37 ]


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 24-05 20:08
Ik zat er gister ook even over na te denken en wilde wat posten, toen ik maar besloot om thuis wat te postten.
Het leek me idd dat je gewoon facts kunt gebruiken aangezien die al een 'soort van' metadata zijn. Btw, je zou ook lijsten binnen lijsten kunnen gebruiken met facts, op die manier kan je een reeks metadata meegeven evt in de form van een fact.
[[data, metadata, metadata, metadata],[data,metadata,...],...]

Overigens, wat is die syntax met een @ ? Die ken ik niet. (heb ooit in een of andere prolog exoot wat gedaan)

[ Voor 7% gewijzigd door Dash2in1 op 02-12-2003 10:14 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Dash2in1 schreef op 02 december 2003 @ 09:54:
Het leek me idd dat je gewoon facts kunt gebruiken aangezien die al een 'soort van' metadata zijn.
Hoe bedoel je?
Btw, je zou ook lijsten binnen lijsten kunnen gebruiken met facts, op die manier kan je een reeks metadata meegeven evt in de form van een fact.
[[data, metadata, metadata, metadata],[data,metadata,...],...]
Ik voeg die metafacts gewoon toe aan mijn factbase, waarom zou ik het in lijsten van lijsten gaan plaatsen?
Overigens, wat is die syntax met een @ ? Die ken ik niet.
Is nieuw ;) (gejat van java metadata) Ik schrijf zelf een prolog intepreter omdat er een aantal vreemde eisen zijn en een prolog interpreter niet zo gecompliceerd is.

aantal vreemde eisen:
-type systeem om het serieus in te zetten
-metadata
-veel info meenemen bij het opbouwen van conclusies

en nog een aantal anderen.

[ Voor 54% gewijzigd door Alarmnummer op 02-12-2003 10:13 ]


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 24-05 20:08
Ik bedoel dit zoiets als volgt. Stel je wilt zeggen dat een rechtbank een uitspraak heeft gedaan ergens over:
code:
1
2
3
4
5
6
rechtbank(amsterdam).
rechtbank(utrecht).

delict(moord).
persoon(pistolen_paultje).
uitspraak(rechtbank(amsterdam), delict(moord), persoon(pistolen_paultje)).


Dit zegt toch al dat de uitspraak is gedaan door de rechtbank in amsterdam, dat het een moord betreft en dat pistolen paultje schuldig is bevonden?
[...]
Ik voeg die metafacts gewoon toe aan mijn factbase, waarom zou ik het in lijsten van lijsten gaan plaatsen?
Met lijsten kan je vaak dingen mooi recursief oplossen en dat is, volgens mij, toch vaak hoe dingen opgelost 'moeten' worden in prolog.

Ik zat overigens te denken aan zoiets:
code:
1
misdrijf([[paultje, naam, persoon, man], [moord, delict, ...],....]).

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Dash2in1 schreef op 02 december 2003 @ 10:33:
[...]

Ik bedoel dit zoiets als volgt. Stel je wilt zeggen dat een rechtbank een uitspraak heeft gedaan ergens over:
code:
1
2
3
4
5
6
rechtbank(amsterdam).
rechtbank(utrecht).

delict(moord).
persoon(pistolen_paultje).
uitspraak(rechtbank(amsterdam), delict(moord), persoon(pistolen_paultje)).


Dit zegt toch al dat de uitspraak is gedaan door de rechtbank in amsterdam, dat het een moord betreft en dat pistolen paultje schuldig is bevonden?
Maar hoe wou je data gaan koppelen aan bv mijn schuldigheids regel?

code:
1
schuldig(P,I):-moord_gepleegd(P),instantie(I),I=rechtbank


Dit vind ik te opdringerig omdat je nu ineens allerlei argumenten mee moet gaan slepen.
Met lijsten kan je vaak dingen mooi recursief oplossen en dat is, volgens mij, toch vaak hoe dingen opgelost 'moeten' worden in prolog.
Ik zie wat je bedoelt. Ik zou het trouwens niet in lijsten plaatsen, maar gewoon in een structure omdat de relaties tussen de argument termen behouden blijft (en bij een lijst is dit niet het geval).

Een recursie is idd erg krachtig, maar in dit geval onnodig denk ik. Je voegt deze facts toe aan je factbase (zoals het gewoonlijk ook doet) en het verschil tussen data en metadata is eigelijk alleen nog maar iets wat tussen je oren zit. Voor prolog maakt het niet uit.

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 24-05 20:08
Alarmnummer schreef op 02 december 2003 @ 10:54:
[...]

Maar hoe wou je data gaan koppelen aan bv mijn schuldigheids regel?

code:
1
schuldig(P,I):-moord_gepleegd(P),instantie(I),I=rechtbank


Dit vind ik te opdringerig omdat je nu ineens allerlei argumenten mee moet gaan slepen.
Hoezo vind je dat te opdringerig? Persoonlijk vind ik het wel meevallen, het zegt vrij duidelijk wat er bedoeld wordt. Naja, ik zou denk ik in dit geval een andere naam kiezen; iets als schuldig_bevonden_door(P,I) of iets in die trant.
Het enige probleem wat ik zou zien is dat je mogelijkerwijze een hele reeks aan argumenten mee zou moeten geven. Dan zou je er misschien ook nog voor kunnen kiezen eea op te splitsen in verschillende 'methodes' (ben ff de naam kwijt van die dingen in prolog)
[...]

Ik zie wat je bedoelt. Ik zou het trouwens niet in lijsten plaatsen, maar gewoon in een structure omdat de relaties tussen de argument termen behouden blijft (en bij een lijst is dit niet het geval).

Een recursie is idd erg krachtig, maar in dit geval onnodig denk ik.
Recursie is wellicht idd niet nodig.
Je voegt deze facts toe aan je factbase (zoals het gewoonlijk ook doet) en het verschil tussen data en metadata is eigelijk alleen nog maar iets wat tussen je oren zit. Voor prolog maakt het niet uit.
Dat bedoelde ik met wat ik eerder zei, alleen wat beter verwoordt ;) :
Het leek me idd dat je gewoon facts kunt gebruiken aangezien die al een 'soort van' metadata zijn.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Dash2in1 schreef op 02 december 2003 @ 12:27:
[...]

Hoezo vind je dat te opdringerig? Persoonlijk vind ik het wel meevallen, het zegt vrij duidelijk wat er bedoeld wordt. Naja, ik zou denk ik in dit geval een andere naam kiezen; iets als schuldig_bevonden_door(P,I) of iets in die trant.
Pas op een meta nivo (nivo boven dit nivo) ga je pas gebruik maken van die meta data, daarom wil ik het dus zo weinig mogelijk laten doordringen op dit nivo. Het is de bedoeling dat eerst alle oplossingen worden gemaakt, waarbij die metadata dus mee wordt gedragen maar eigelijk niets mee wordt gedaan en pas op meta nivo ga je hier ook echt iets mee doen.

Op metanivo ga je bv verschillende conclusies met elkaar vergelijken en daarover kan je weer nieuwe gegevens afleiden. Je zou bv alleen alle conclusies willen zien die door een hoger gerechtshof zijn gemaakt.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
*kick*

Zijn er niet meer prolog liefhebbers hier?

[ Voor 80% gewijzigd door Alarmnummer op 04-12-2003 11:16 ]


  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 27-05 10:14

Eelke Spaak

- Vlad -

Volgens mij ga ik binnenkort Prolog krijgen in één van de inleidingscursussen AI aan de KUN. Wanneer ik er iets van gehad heb zal ik me hier in mengen. :P

TheStreme - Share anything with anyone


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Ik heb intussen wel wat ervaring met prolog, maar het gekke is dat je altijd nieuwe mogelijkheden blijft ontdekken en dat terwijl de taal super eenvoudig is. Bv het meta programmeren is te gek :)

[ Voor 5% gewijzigd door Alarmnummer op 04-12-2003 11:30 ]


Verwijderd

waarom zet je de metadata dan niet in een eigen predicaat dus:

delict(?Dader,?Delict,?Metadata).

schuldig(Dader,Incident):- delict(Dader,Incident,_).

de metadata zet je dan of in een predicaat of een Lijst, afhankelijk of je vaste hoeveelheden hebt of niet.

Verwijderd

Hehe moet je dit kennen als je ooit nog van plan bent een studie KI te gaan volgen :p ?

Is dit niet een soort ouderwetse OCAML ?

We leuk trouwens, dat met die facts etc...
Ik krijg dat nu bij Discrete Wiskunde, ik dacht dat ze het "waarheidstheorie" noemen moet p en q etc...

If only I knew the syntax... dan zou deze geinteresseerde newbie je graag helpen :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Verwijderd schreef op 05 december 2003 @ 09:44:
waarom zet je de metadata dan niet in een eigen predicaat dus:

delict(?Dader,?Delict,?Metadata).
Dit is metadata over de facts, en ik heb metadata nodig bij een regel. En mijn vb:

code:
1
2
schuldig(P):-moord_gepleegd(P)
     @instantie(rechtbank)


Komt in de factbase gewoon als:
code:
1
@instantie(schuldig(P):-moord_gepleegd(P),rechtbank).


Ik heb dus een manier nodig om metadata te koppelen aan regels en niet zozeer aan feiten. En verder mag metadata niet al te opdringerig zijn (dus liever niet als argument meegeven), omdat het systeem in 2 lagen opgezet gaat worden. Eerst bepaal je de regels om uitspraken te bepalen (waarbij je totaal niet kijkt naar metadata), en daarna voeg je metadata toe aan die regels, om icm metaregels uitspraken te doen over die uitspraken.

[ Voor 9% gewijzigd door Alarmnummer op 05-12-2003 10:03 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Verwijderd schreef op 05 december 2003 @ 09:58:
Hehe moet je dit kennen als je ooit nog van plan bent een studie KI te gaan volgen :p ?

Is dit niet een soort ouderwetse OCAML ?
Prolog is een LOG(ische) PRO(grammeertaal) en de werking ervan is heel anders dan een functionele. Functionele programmeertalen zijn veel minder declaratief dan logische en bezitten niet dezelfde krachtige unificatie eigenschappen als logische.

code:
1
2
3
4
parent(tom,pat).
parent(pat,kim).

grandparent(X,Y):-parent(X,Z),parent(Z,Y).

Als je kijk naar de grandparent regel, dan zie je dat er een Z is geintroduceerd waar van buitenaf geen waarde aan gegeven kan worden. Prolog zoekt hiervoor een waarde op. Dit is iets wat een functionele taal niet kan.

Als ik ga vragen of tom een grandparent van kim is, dan zoekt hij zelf op dat Z dan pat moet zijn.
If only I knew the syntax... dan zou deze geinteresseerde newbie je graag helpen :)
Prolog syntax heb je in 10 minuten onder de knie omdat er eigelijk nauwelijks syntax is.

[edit]
code:
1
grandparent(X,Y):-parent(X,Z),parent(Z,Y).


Kan je lezen als:

code:
1
if parent(X,Z) and parent(Z,Y) then grandparent(X,Y)

[ Voor 13% gewijzigd door Alarmnummer op 05-12-2003 10:24 ]


  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02-2025
Misschien moet je ook eens naar SWI-prolog kijken.
(http://www.swi-prolog.org/)
Een erg uitgebreide prolog variant met vele bibliotheken, o.a. voor XML/SGML, RDF en ODBC. Tevens is er een koppeling voor Java te verkrijgen.

Verwijderd

Verwijderd schreef op 05 december 2003 @ 09:58:
Hehe moet je dit kennen als je ooit nog van plan bent een studie KI te gaan volgen :p ?

Is dit niet een soort ouderwetse OCAML ?

We leuk trouwens, dat met die facts etc...
Ik krijg dat nu bij Discrete Wiskunde, ik dacht dat ze het "waarheidstheorie" noemen moet p en q etc...

If only I knew the syntax... dan zou deze geinteresseerde newbie je graag helpen :)
www.swi-prolog.org staat zo'n beetje alles wat je wilt weten en een goede ontwikkel omgeving.

Prolog is voortgekomen uit de predicaat logica. Het enige wat je doet is de predicaat regels uitschrijven en prolog interperteert deze voor je.

De syntax heb je zo door maar het goed en slim schrijven van code vergt toch wel de nodige oefening.

Is het geen idee om dan de extra meta data als volgt te asserten:

een zaak als volgt:

assert(strafzaak(Zaaknummer,Dader,Soort)).

assert(metadata(Zaaknummer,Lijstmetmetadata)).

bij het redeneren heb je geen 'last' van de meta data terwijl deze op een hoger niveau wel beachikbaar is, maar ik heb het idee dat we een beetje langs elkaar heen praten ;)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Verwijderd schreef op 05 december 2003 @ 11:46:
[...]
www.swi-prolog.org staat zo'n beetje alles wat je wilt weten en een goede ontwikkel omgeving.
Ik schrijf liever mijn eigen om de volgende redenen:

-ik weet dan hoe zo`n engine werkt. Afgezien van mijn interesse wil ik in de toekomst meer met rule engines gaan doen.

-100% bewegingsvrijheid omdat je alles kan inrichten zoals je het hebben wilt. Er zijn een groot aantal vreemde wensen, en ik weet zeker dat ik die dan kan vervullen.

Verder zijn er ook genoeg java varianten van Prolog, hier kan ik natuurlijk ook uit kiezen.
De syntax heb je zo door maar het goed en slim schrijven van code vergt toch wel de nodige oefening.
De mogelijkheden zijn oneindig met prolog terwijl je de syntax zo onder de knie hebt.
Is het geen idee om dan de extra meta data als volgt te asserten:

een zaak als volgt:

assert(strafzaak(Zaaknummer,Dader,Soort)).

assert(metadata(Zaaknummer,Lijstmetmetadata)).

bij het redeneren heb je geen 'last' van de meta data terwijl deze op een hoger niveau wel beachikbaar is, maar ik heb het idee dat we een beetje langs elkaar heen praten ;)
Ik heb metadata gekoppeld aan regels nodig. Die metadata is gewoon een fact met als 1e argument de regel, en als 2e de waarde. In jouw bovenstaande voorbeeld is er geen meta data gekoppeld aan een regel.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Update :)

Ik begon me eigelijk af te vragen wat mijn queries (goals) eigelijk op meta nivo zouden worden. Je kan hetzelfde metaredenatie bestand op meerdere redenatie bestanden los te laten, en daarom weet je in principe niet veel specifieks van een redenatie bestand. Bij mij kwam dus de vraag opzetten van wat gaat dan je query worden?

De oplossing was eigelijk dood eenvoudig. Ik introduceer een variable Solutions waaraan de lijst met oplossingen is gebonden. Op deze manier zou ik bv het volgende kunnen zeggen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
prefereer(X,Y,Z)... (bedenk iets)

meest_geprefereerde([X],X).

meest_geprefereerde([X,Tail],Y)
    :-meest_geprefereerde(Tail,Z),prefereer(X,Z,Y).

    
//Solutions is dus een Variable die al is gebonden aan 
//de lijst met oplossingen van lager nivo.  
goals
    meest_geprefereerde(Solutions,X)


Verder kan je natuurlijk van meest_geprefereerde ook een hogere orde predikaat kunnen maken (dwz dat je een predikaat kan meegeven als argument). Hierdoor kan je het detail gedrag (dus de prefereer predikaat) variabel maken (te vergelijken met een hogere orde functie).

[ Voor 5% gewijzigd door Alarmnummer op 09-12-2003 16:02 ]

Pagina: 1