smokalot schreef op 08 March 2003 @ 14:48:
Mooie oplossing, declaratief gezien. Maar wat ik heb geleerd is dat je append waar mogelijk moet vermijden, omdat het erg veel querries doet, die over het algemeen niet noodzakelijk zijn.
Dan hebben ze het je verkeerd geleerd. Je moet nadenken over wat je doet, en bij een taal als Prolog ook heel goed nadenken over hoe de code die je schrijft uitgevoerd gaat worden.
Als je vindt dat mijn code inefficient is, dan wil ik dat graag uitgelegd zien in termen van complexiteit. Ik heb er zelf nog niet over nagedacht, maar op het eerste gezicht zie ik niet in waarom mijn oplossing zo slecht zou zijn (vergeleken met een eenvoudige oplossing zonder append). Kom dus alsjeblieft met een beter argument dan "jouw code is slecht want je gebruikt append".
Prolog wordt hier vaak afgeschilderd als kut, klote, [vul een ander scheldwoord in], en op zich kan ik me dat voorstellen vanuit de algemene bedoelingen van de progsels van ons tweakers, maar Prolog heeft ook echt wel hele mooie toepassingen, waar het zeer geschikt voor is. Een van de meestgebruikte toepassingen is denk ik toch taalonderzoek, vandaar ook de ingebouwde DCG-implementatie. Ik moet er niet aan denken dat ik dat soort dingen in Java op zou moeten schirjven...
Voor algoritmisch programmeren is Prolog waardeloos, omdat je vastzit aan een veel te beperkt aantal datastructuren (alleen lijsten, feitelijk) en te weinig zoektechnieken (alleen backtracking). Je moet dus allerlei slecht leesbare (en schrijfbare) work-arounds gaan verzinnen om toch tot degelijke implementaties te komen.
Daarbij is het typesysteem ofwel afwezig (zoals in GNU Prolog) ofwel beperkt het de herbruikbaarheid van functies (zoals in VisualProlog, waarin je bijvoorbeeld geen generieke append/3, of length/2 kan schrijven

), wat het ontwikkelen van grote complexe applicaties danig in de weg staat. Daarbij verdwijnt in veel praktische implementaties ook de "omkeerbaarheid" van predicaten (dus de eigenschap dat je invoer- en uitvoertermen kunt afwisselen).
Verder zijn predicaten meestal niet vrij van neveneffecten, wat tot gevolg heeft dat de uitwerking van een programma niet los gezien kan worden van optimalisaties op codenivo (red cuts). Dat vind ik een erg vervelende eigenschap, voor een hoog-nivo taal, en druist tegen de declaratieve natuur van de taal in (het hoort niet uit te maken hoe een feit geconstateerd wordt).
Tenslotte is het praktisch onmogelijk om vanuit Prolog op een nette wijze om te gaan met bestaande libraries, waardoor de integratie met externe tools uiterst moeizaam verloopt.
Al met al vind ik Prolog dus een kuttaal voor algemene toepassingen, al zijn er vast wel een aantal specifieke domeinen waar de taal wel handig voor is (maar dan wordt het meer een domeintool dan een programmeertaal, als je het mij vraagt).