A.I. programming in Prolog and Assembler

February 20, 2022

PapaGEN 1.05: Political Blather Text Generator (Γεννήτρια Παπάτζας)

Το PapaGEN γεννάει… παπάτζες, αληθοφανείς “ξύλινες” πολιτικούρες με λέξεις ταιριαστές… όχι μόνο συντακτικά ή γραμματικά, αλλά και λογικά ή εννοιολογικά σύμφωνα με δικά του λεξιλόγια και ιδεολογικά “αξιώματα”. Κύριος στόχος του PapaGEN είναι η σάτιρα και προσομοίωση φανατικών ιδεοληψιών, αλλά δεν αποκλείονται άλλες χρήσεις, σύμφωνα με το εκάστοτε λεξιλόγιο / βάση δεδομένων.

Το demo μιας παλαιότερης έκδοσης δεν υπάρχει πια, διότι έπεσε το κανάλι μου στο YouTube στις 19/8/2021, μετά από χακάρισμα στο Gmail μου. Λόγω απώλειας του παλιού demo, ανέβασα στο Vimeo το εξής καινούργιο. Για να το απολαύσετε καλύτερα, δείτε το σε Full Screen mode:

Οι λέξεις επιλέγονται τυχαία, αλλά μόνο αν ταιριάζουν μεταξύ τους με βάση “ιδεολογικά αξιώματα” και (εννοιο)λογικούς κανόνες , καθώς και γραμματικο-συντακτικούς και μορφολογικούς κανόνες. Ο χρήστης μπορεί να φορτώσει διαφορετικά “λεξικά ορισμών”. Προς το παρόν φτιάχτηκαν δύο τέτοια λεξικά, ένα που προσομοιώνει… υπερ-αριστερές παπάτζες κι ένα άλλο με… υπερ-πατριωτικές.

Δείτε επίσης:

  1. Kombos'(Knot), the first Greek computer-game commercially released (in 1984, ZX-Spectrum)
  2. HyperLOGIC R&D, the company behind HyperLEX (η εταιρεία του λεξικού HyperLEX)
  3. Ultra-Fast Hybrid Genetic Algorithm In Assembly Language For The Travelling Salesman Problem (DLL For LPA Prolog)

Μερικά δείγματα Παπάτζας:

1

Στηρίζουμε την αντιφασιστική συσπείρωση. Σαν αριστεροί που εγκατέλειψαν οφφίτσια και συντρόφους, θέλουμε την πανευρωπαϊκή αντικαπιταλιστική ριζοσπαστική ριζική αλλαγή και αποστομώνουμε την φασιστική αντιδραστική διασπαστική ρατσιστική απειλή. Απορρίπτουμε τη φασιστική εντατικοποίηση της αντίδρασης και απομονώνουμε τη διχαστική αυταρχικότητα των μονοπωλίων. Απορρίπτουμε την αλλοτριωτική απειλή του τεχνοφασισμού και εγκαταλείψαμε οφέλη και καρέκλες για την δυναμική επαναστατική πατριωτική υπέρβαση. Στηρίζουμε την ισχυρή αντιφασιστική προοπτική. Απομονώνουμε τη φασιστική μιζέρια της ακροδεξιάς. Καταγγέλλουμε τη διασπαστική εντατικοποίηση της αντίδρασης. Απορρίπτουμε τη μονοπωλιακή αντιδραστική απειλή του τεχνοφασισμού και αρνούμαστε την ιμπεριαλιστική απειλή του τεχνοφασισμού. Εμβαθύνουμε στη ριζοσπαστική αντιφασιστική αντινεοφιλελεύθερη ηγεμονία. Απορρίπτουμε την αλλοτριωτική αντιενωτική διασπαστική εντατικοποίηση της αντίδρασης. Απομονώνουμε τη φασιστική αυταρχικότητα του κατεστημένου. Αρνούμαστε την αντιενωτική νεοφιλελεύθερη μιζέρια της παγκοσμιοποίησης και υποστηρίζουμε την αντικαπιταλιστική αλληλεγγύη. Καταγγέλλουμε τη νεοφιλελεύθερη αυταρχικότητα των μονοπωλίων και αποστομώνουμε την διασπαστική απειλή του κατεστημένου. Πολεμάμε τη διασπαστική ιμπεριαλιστική μιζέρια. Καταγγέλλουμε τη μονοπωλιακή απειλή των μονοπωλίων. Εμείς, οι μόνοι τίμιοι αριστεροί που πετάξαμε στα σκουπίδια θέσεις και θώκους, αγωνιζόμαστε για την οικολογική ριζική αλλαγή και θυσιάσαμε θώκους και υπουργεία για την επαναστατική ανατροπή. Αρνούμαστε τη φασιστική απειλή της ακροδεξιάς. Είμαστε στις επάλξεις του φιλεργατικού διεθνιστικού λαϊκού μαρξιστικού αντικαπιταλιστικού μετώπου και αρνούμαστε την αντιδημοκρατική απειλή του οικονομικού επεκτατισμού. Πολεμάμε την αντιδημοκρατική φασιστική ιμπεριαλιστική ρατσιστική καπιταλιστική απειλή της λιτότητας και αντιπαλεύουμε την μονοπωλιακή εντατικοποίηση της παγκοσμιοποίησης. Αντιπαλεύουμε την αλλοτριωτική μιζέρια. *
PapaGen v1.05: RHETORIC TEXT GENERATOR by George A. Stathis (OMADEON)
Knowledge-base Topic: Pseudo-Ultra-Left Political Bullshit 2
Date: Sunday 20/2/2022, Time: 16:26:28. Developed in VISUAL PROLOG and Assembly X86

Number of Sentences = 20. Minimum Sentence Size = 3 Words. Time needed = 0.016 seconds

2

Αγανακτούμε για την ιμπεριαλιστική φασιστική διασπαστική ρατσιστική αλλοτριωτική απειλή της παγκοσμιοποίησης και θαυμάζουμε την αντιϊμπεριαλιστική αντιφασιστική ριζική αλλαγή. Αρνούμαστε τη διασπαστική ιμπεριαλιστική ρατσιστική απειλή του οικονομικού επεκτατισμού. Απορρίπτουμε την αλλοτριωτική μονοπωλιακή αυταρχικότητα του συστήματος και απομονώνουμε την διχαστική ρατσιστική απειλή της ακροδεξιάς. Θαυμάζουμε την πανευρωπαϊκή αλληλεγγύη. Αντιστεκόμαστε στην καπιταλιστική επέλαση της λιτότητας. Καταγγέλλουμε τη διχαστική διασπαστική αντιδραστική απειλή της λιτότητας και αντιπαλεύουμε την αντιενωτική φασιστική μιζέρια του οικονομικού επεκτατισμού. Προστατεύουμε την αντιρατσιστική αντιϊμπεριαλιστική υπέρβαση. Αγανακτούμε για τη φασιστική μονοπωλιακή εντατικοποίηση της αντίδρασης και προστατεύουμε την επαναστατική ηθική υπερηφάνεια. Προστατεύουμε τη σοσιαλιστική κινητοποίηση του λαού. Αντιστεκόμαστε στη μονοπωλιακή φασιστική αυταρχικότητα της λιτότητας και απομονώνουμε την αντιλαϊκή δεξιά. Εμβαθύνουμε στη δυναμική αριστερή ηθική υπερηφάνεια. Βοηθάμε τη δημοκρατική ομοψυχία. Απορρίπτουμε τη διχαστική αντιδραστική ακροδεξιά. Απορρίπτουμε την αντιλαϊκή απειλή της αντίδρασης. Σαν αριστεροί που εγκατέλειψαν επαίνους και θέσεις, θέλουμε την ανανεωτική ανατροπή. Αντιπαλεύουμε την αντιδραστική φασιστική απειλή. Πολεμάμε τη μονοπωλιακή επέλαση της παγκοσμιοποίησης. Πολεμάμε τη φασιστική μιζέρια των μονοπωλίων. Είμαστε στις επάλξεις του λαϊκού προτάγματος και πολεμάμε την αλλοτριωμένη αντιενωτική διχαστική ιμπεριαλιστική αυταρχικότητα της ακροδεξιάς. Απορρίπτουμε την αντιλαϊκή απειλή της ακροδεξιάς. *
PapaGen v1.05: RHETORIC TEXT GENERATOR by George A. Stathis (OMADEON)
Knowledge-base Topic: Pseudo-Ultra-Left Political Bullshit 2
Date: Sunday 20/2/2022, Time: 16:23:49. Developed in VISUAL PROLOG and Assembly X86

Number of Sentences = 20. Minimum Sentence Size = 3 Words. Time needed = 0.078 seconds

3

Ενισχύουμε την προοδευτική αριστερά. Είμαστε στις επάλξεις της ενωτικής κινητοποίησης του λαού και αποστομώνουμε την αντιλαϊκή αντιενωτική αυταρχικότητα της ακροδεξιάς. Πολεμάμε την αντιδημοκρατική μιζέρια της λιτότητας και αντιπαλεύουμε την αλλοτριωτική απειλή του τεχνοφασισμού. Αποστομώνουμε τη διασπαστική προπαγάνδα και καταγγέλλουμε την αλλοτριωτική ιμπεριαλιστική καπιταλιστική αντιδημοκρατική ρατσιστική μιζέρια του οικονομικού επεκτατισμού. Εμβαθύνουμε στη διεθνιστική δημοκρατική συνεργασία και απορρίπτουμε τη διχαστική απειλή της λιτότητας. Αποστομώνουμε τη φασιστική μιζέρια της δεξιάς. Απομονώνουμε την αλλοτριωτική αυταρχικότητα της δεξιάς. Απορρίπτουμε την αντιδραστική αυταρχικότητα της αντίδρασης και απομονώνουμε την φασιστική αυταρχικότητα του τεχνοφασισμού. Αντιπαλεύουμε την καπιταλιστική απειλή του κατεστημένου. Πολεμάμε την αντιενωτική αλλοτριωτική απειλή των μονοπωλίων. Απορρίπτουμε την καπιταλιστική απειλή της λιτότητας. Αποστομώνουμε τη διασπαστική εντατικοποίηση του κατεστημένου. Αντιπαλεύουμε την αντιενωτική απειλή. Βοηθάμε την αντιμονοπωλιακή ενωτική ηγεμονία και αντιπαλεύουμε την φασιστική απειλή του τεχνοφασισμού. Πολεμάμε την αντιδραστική αντιλαϊκή διασπαστική διχαστική αντιδημοκρατική απειλή της παγκοσμιοποίησης και οργανώνουμε την πατριωτική ριζοσπαστικοποίηση. Πολεμάμε τη φασιστική εντατικοποίηση της ακροδεξιάς. Προωθούμε την επαναστατική υπέρβαση και καταγγέλλουμε την νεοφιλελεύθερη απειλή της λιτότητας. Πολεμάμε την αντιδημοκρατική εντατικοποίηση του οικονομικού επεκτατισμού και αντιστεκόμαστε στην καπιταλιστική νεοφιλελεύθερη αυταρχικότητα των μονοπωλίων. Αρνούμαστε τη διασπαστική αυταρχικότητα του τεχνοφασισμού και αποστομώνουμε τη μονοπωλιακή επέλαση της αντίδρασης. Αποστομώνουμε την αντιδραστική αντιενωτική φασιστική επέλαση του τεχνοφασισμού. Καταγγέλλουμε τη νεοφιλελεύθερη αυταρχικότητα του τεχνοφασισμού. Είμαστε στην πρώτη γραμμή της λαϊκής μαρξιστικής αντικαπιταλιστικής προοδευτικής ηθικής υπερηφάνειας και απομονώνουμε την φασιστική απειλή της παγκοσμιοποίησης. Αγανακτούμε για τη μονοπωλιακή νεοφιλελεύθερη εντατικοποίηση και αποστομώνουμε την αλλοτριωτική απειλή του τεχνοφασισμού. Αρνούμαστε την ιμπεριαλιστική απειλή της παγκοσμιοποίησης και καταγγέλλουμε την μονοπωλιακή φασιστική αντιενωτική απειλή του τεχνοφασισμού. Βοηθάμε τη ριζοσπαστική αντιϊμπεριαλιστική συνεργασία και αντιστεκόμαστε στην αντιδραστική αυταρχικότητα της αντίδρασης. *
PapaGen v1.05: RHETORIC TEXT GENERATOR by George A. Stathis (OMADEON)
Knowledge-base Topic: Pseudo-Ultra-Left Political Bullshit 2
Date: Sunday 20/2/2022, Time: 16:15:49. Developed in VISUAL PROLOG and Assembly X86

Number of Sentences = 25. Minimum Sentence Size = 3 Words. Time needed = 0.079 seconds

4

Αρνούμαστε την αλλοτριωμένη αντιενωτική αντιλαϊκή απειλή του τεχνοφασισμού και πολεμάμε την νεοφιλελεύθερη απειλή της ακροδεξιάς. Αρνούμαστε τη ρατσιστική αντιενωτική απειλή του τεχνοφασισμού και είμαστε στις επάλξεις της δημοκρατικής προοδευτικής συνειδητοποίησης. Καταγγέλλουμε την αντιδραστική αυταρχικότητα της παγκοσμιοποίησης. Αντιπαλεύουμε την αλλοτριωτική απειλή του τεχνοφασισμού. Αρνούμαστε τη φασιστική απειλή της αντίδρασης. Χαιρετίζουμε τις φιλεργατικές αντικαπιταλιστικές ριζοσπαστικές ανανεωτικές διεθνιστικές αριστερές ιδέες και απορρίπτουμε την αντιλαϊκή αλλοτριωτική απειλή των μονοπωλίων. Αρνούμαστε τη ρατσιστική διασπαστική μιζέρια του οικονομικού επεκτατισμού. Πολεμάμε τη φασιστική αντιδημοκρατική αυταρχικότητα της ακροδεξιάς και αντιπαλεύουμε τη νεοφιλελεύθερη απειλή των μονοπωλίων. Αρνούμαστε την αλλοτριωμένη καπιταλιστική διχαστική απειλή του κατεστημένου. Καταγγέλλουμε τη διχαστική αυταρχικότητα της ακροδεξιάς και αγανακτούμε για τη νεοφιλελεύθερη μιζέρια της παγκοσμιοποίησης. Αρνούμαστε τη φασιστική νεοφιλελεύθερη απειλή των μονοπωλίων. Απορρίπτουμε την καπιταλιστική απειλή της παγκοσμιοποίησης. Χαιρετίζουμε την προοδευτική συσπείρωση και αντιπαλεύουμε την αντιδημοκρατική λαίλαπα. Προστατεύουμε την απελευθερωτική μαρξιστική αντιρατσιστική αριστερή ηθική υπερηφάνεια και πολεμάμε την διχαστική απειλή της παγκοσμιοποίησης. Είμαστε στις επάλξεις των σοσιαλιστικών αγώνων και αντιστεκόμαστε στην ιμπεριαλιστική απειλή της ακροδεξιάς. Πολεμάμε τη νεοφιλελεύθερη εντατικοποίηση της λιτότητας. Αποστομώνουμε την αντιλαϊκή αντιδημοκρατική αντιενωτική νεοφιλελεύθερη αυταρχικότητα της ακροδεξιάς και αρνούμαστε την φασιστική μιζέρια της αντίδρασης. Εμβαθύνουμε στο προοδευτικό κίνημα. Αντιστεκόμαστε στην αντιδημοκρατική αυταρχικότητα της λιτότητας και απορρίπτουμε την διασπαστική ρατσιστική ιμπεριαλιστική αντιδραστική μιζέρια του οικονομικού επεκτατισμού. Αποστομώνουμε τη διασπαστική αντιδραστική μιζέρια της δεξιάς. Αγανακτούμε για τη φασιστική απειλή των μονοπωλίων. Ενισχύουμε τη σοσιαλιστική συσπείρωση. Πολεμάμε την αλλοτριωμένη απειλή της αντίδρασης και αγανακτούμε για την αντιλαϊκή επέλαση της παγκοσμιοποίησης. Αντιστεκόμαστε στην αντιενωτική μονοπωλιακή διασπαστική αλλοτριωτική αυταρχικότητα της λιτότητας και απομονώνουμε την ιμπεριαλιστική αυταρχικότητα της λιτότητας. Αντιπαλεύουμε τη φασιστική αντιλαϊκή απειλή της παγκοσμιοποίησης και πολεμάμε την ιμπεριαλιστική αλλοτριωτική απειλή της ακροδεξιάς. Αντιπαλεύουμε την αντιδραστική διχαστική αλλοτριωτική απειλή της λιτότητας και στηρίζουμε την αντικαπιταλιστική διεθνιστική πανευρωπαϊκή φιλεργατική ανατροπή. Αντιστεκόμαστε στην αντιδραστική απειλή της λιτότητας και βοηθάμε την αριστερή κινητοποίηση του λαού. Προστατεύουμε την ενωτική συσπείρωση και αντιπαλεύουμε την μονοπωλιακή αυταρχικότητα της αντίδρασης. Αποστομώνουμε την αλλοτριωτική ρατσιστική απειλή του κατεστημένου και αντιστεκόμαστε στην ιμπεριαλιστική φασιστική καπιταλιστική απειλή του κατεστημένου. Αγανακτούμε για την αντιδραστική ιμπεριαλιστική απειλή των μονοπωλίων. *
PapaGen v1.05: RHETORIC TEXT GENERATOR by George A. Stathis (OMADEON)
Knowledge-base Topic: Pseudo-Ultra-Left Political Bullshit 2
Date: Sunday 20/2/2022, Time: 16:20:15. Developed in VISUAL PROLOG and Assembly X86

Number of Sentences = 30. Minimum Sentence Size = 3 Words. Time needed = 0.063 seconds

5

Πολεμάμε την αντιενωτική αντιδημοκρατική κατρακύλα της παγκοσμιοποίησης. Καταγγέλλουμε την αντιλαϊκή αντίδραση και πολεμάμε την καπιταλιστική διχαστική απειλή της λιτότητας. Αποστομώνουμε την ιμπεριαλιστική απειλή της αντίδρασης και οργανώνουμε την αντιϊμπεριαλιστική κινητοποίηση του λαού. Βοηθάμε την αντιφασιστική λαϊκή ηθική υπερηφάνεια. Βοηθάμε τις προοδευτικές ιδέες. Αντιπαλεύουμε τη μονοπωλιακή προπαγάνδα και αρνούμαστε την καπιταλιστική απειλή της λιτότητας. Πολεμάμε την αλλοτριωτική νεοφιλελεύθερη απειλή του οικονομικού επεκτατισμού. Βοηθάμε τις διεθνιστικές ανανεωτικές εργασιακές διεκδικήσεις. Αντιπαλεύουμε την αντιδημοκρατική απειλή των μονοπωλίων. Απομονώνουμε τη μονοπωλιακή διχαστική κατρακύλα της δεξιάς. Αρνούμαστε τη φασιστική αυταρχικότητα της λιτότητας. Καταγγέλλουμε τη μονοπωλιακή αντιενωτική μιζέρια και απορρίπτουμε την καπιταλιστική φασιστική διχαστική ρατσιστική απειλή του κατεστημένου. Πολεμάμε τη μονοπωλιακή μιζέρια του οικονομικού επεκτατισμού. Εμείς, οι μόνοι γνήσιοι επαναστάτες που αφήσαμε υπουργεία και οφφίτσια, αγωνιζόμαστε για την οικολογική συνειδητοποίηση. Απορρίπτουμε την αντιδραστική μιζέρια του οικονομικού επεκτατισμού. Εμβαθύνουμε στην πανευρωπαϊκή φιλεργατική διεθνιστική αντιφασιστική αντινεοφιλελεύθερη αριστερή προοπτική και αγανακτούμε για την αλλοτριωμένη διχαστική αντιλαϊκή απειλή της ακροδεξιάς. Πολεμάμε τη νεοφιλελεύθερη κατρακύλα του οικονομικού επεκτατισμού και απορρίπτουμε την ιμπεριαλιστική προπαγάνδα. Προτείνουμε την αριστερή ενωτική ανατροπή και απομονώνουμε την διχαστική επέλαση της λιτότητας. Απομονώνουμε την καπιταλιστική αντιδραστική μιζέρια των μονοπωλίων. Αγανακτούμε για την αντιλαϊκή παγκοσμιοποίηση. Είμαστε στις επάλξεις της αντιφασιστικής μαρξιστικής συνειδητοποίησης και προωθούμε τη διεθνιστική ριζοσπαστική ομοψυχία. Προωθούμε την αντιμονοπωλιακή αλληλεγγύη και αγανακτούμε για την καπιταλιστική μονοπωλιακή απειλή της ακροδεξιάς. Οργανώνουμε τις εργατικές αντιϊμπεριαλιστικές εργασιακές διεκδικήσεις και αποστομώνουμε την αλλοτριωτική ιμπεριαλιστική κατρακύλα της δεξιάς. Αποστομώνουμε την αλλοτριωτική απειλή της αντίδρασης. Αγανακτούμε για την αλλοτριωμένη καπιταλιστική αντιενωτική διχαστική κατρακύλα των μονοπωλίων και αποστομώνουμε την μονοπωλιακή λαίλαπα του οικονομικού επεκτατισμού. Αντιπαλεύουμε τη μονοπωλιακή αντιλαϊκή αντιδραστική ιμπεριαλιστική διχαστική καπιταλιστική αντιδημοκρατική αυταρχικότητα της ακροδεξιάς και θαυμάζουμε την αριστερή υπέρβαση. Είμαστε στις επάλξεις του οικολογικού κοινωνικού κινήματος. Είμαστε στην πρώτη γραμμή της αντιμονοπωλιακής ομοψυχίας. Αντιπαλεύουμε τη μονοπωλιακή απειλή της ακροδεξιάς και βοηθάμε τη φιλεργατική ηθική υπερηφάνεια. Υπερασπιζόμαστε την αντιρατσιστική προοπτική και αντιπαλεύουμε την διασπαστική ιμπεριαλιστική απειλή της αντίδρασης. *
PapaGen v1.05: RHETORIC TEXT GENERATOR by George A. Stathis (OMADEON)
Knowledge-base Topic: Pseudo-Ultra-Left Political Bullshit 2
Date: Sunday 20/2/2022, Time: 16:31:45. Developed in VISUAL PROLOG and Assembly X86

Number of Sentences = 30. Minimum Sentence Size = 4 Words. Time needed = 0.031 seconds

_____________________________________________

Τα επόμενα 2 δείγματα παπάτζας έχουν το καθένα 50 προτάσεις, με ελάχιστο αριθμό λέξεων=7 κάθε μία, ίδιες ρυθμίσεις αλλά διαφορετικές τυχαίες επιλογές λέξεων κάθε φορά.

6

Καταγγέλλουμε τη διασπαστική φασιστική αντιενωτική μονοπωλιακή διχαστική καπιταλιστική αυταρχικότητα του τεχνοφασισμού. Αρνούμαστε τη ρατσιστική φασιστική αντιενωτική καπιταλιστική επέλαση του τεχνοφασισμού. Αρνούμαστε την αλλοτριωτική μονοπωλιακή φασιστική αντιδραστική απειλή της ακροδεξιάς. Απορρίπτουμε την αλλοτριωτική αντιλαϊκή αντιδημοκρατική ιμπεριαλιστική απειλή της λιτότητας και καταγγέλλουμε την διασπαστική φασιστική κατάντια του κατεστημένου. Αγανακτούμε για τη διχαστική αντιενωτική αυταρχικότητα του οικονομικού επεκτατισμού και ενισχύουμε την αντινεοφιλελεύθερη ριζική αλλαγή. Εγκαταλείψαμε μίζες και συντρόφους για την αντιμονοπωλιακή ενωτική δημοκρατική επανάσταση και απορρίπτουμε την φασιστική αντιδημοκρατική απειλή των μονοπωλίων. Αρνούμαστε την αντιδημοκρατική προπαγάνδα και θαυμάζουμε την φιλεργατική μαρξιστική προοπτική. Είμαστε στην πρώτη γραμμή των πανευρωπαϊκών αντιρατσιστικών ανανεωτικών προοδευτικών ψηφοδελτίων μας. Απομονώνουμε την ιμπεριαλιστική αντιδημοκρατική διχαστική αλλοτριωτική ρατσιστική απειλή της παγκοσμιοποίησης. Αντιπαλεύουμε την αλλοτριωτική ιμπεριαλιστική ρατσιστική αντιδημοκρατική απειλή της παγκοσμιοποίησης. Ενισχύουμε τις αντιϊμπεριαλιστικές μαρξιστικές αντικαπιταλιστικές επαναστατικές αντιφασιστικές εργασιακές διεκδικήσεις και πολεμάμε τη νεοφιλελεύθερη κατρακύλα. Αρνούμαστε τη διασπαστική αντιλαϊκή αντιδραστική αντιδημοκρατική ιμπεριαλιστική ρατσιστική κατάντια του οικονομικού επεκτατισμού. Είμαστε στην πρώτη γραμμή του σοσιαλιστικού αντινεοφιλελεύθερου αντιμονοπωλιακού ενωτικού προοδευτικού κοινωνικού κινήματος. Βοηθάμε τη δυναμική επαναστατική οικολογική δημοκρατική συνειδητοποίηση. Αποστομώνουμε τη μονοπωλιακή αντιενωτική διασπαστική αντιδημοκρατική απειλή της λιτότητας και πολεμάμε την αλλοτριωμένη ρατσιστική αυταρχικότητα της ακροδεξιάς. Αντιπαλεύουμε την αλλοτριωτική διχαστική διασπαστική αντιλαϊκή επέλαση του κατεστημένου. Καταγγέλλουμε τη ρατσιστική αντιλαϊκή αντιδραστική μονοπωλιακή ιμπεριαλιστική απειλή της ακροδεξιάς. Προωθούμε την αντιφασιστική φιλεργατική απελευθερωτική πατριωτική ριζοσπαστική αντιρατσιστική αντικαπιταλιστική ηγεμονία και αποστομώνουμε την φασιστική απειλή του οικονομικού επεκτατισμού. Απορρίπτουμε την αντιενωτική κατάντια του οικονομικού επεκτατισμού και αντιστεκόμαστε στην αντιλαϊκή απειλή της ακροδεξιάς. Εμβαθύνουμε στην αντιρατσιστική λαϊκή διεθνιστική πατριωτική αντιφασιστική πανευρωπαϊκή ηγεμονία και αρνούμαστε την αντιδημοκρατική ιμπεριαλιστική λαίλαπα. Απομονώνουμε την αλλοτριωτική αντιλαϊκή διασπαστική αντιδραστική κατάντια της δεξιάς. Αντιπαλεύουμε την ιμπεριαλιστική φασιστική επέλαση της ακροδεξιάς και αρνούμαστε την αλλοτριωτική απειλή της λιτότητας. Ενισχύουμε την αντικαπιταλιστική επαναστατική εργατική ριζοσπαστική λαϊκή ενωτική κινητοποίηση του λαού. Ενισχύουμε τη ριζοσπαστική ριζική αλλαγή και καταγγέλλουμε τη διχαστική ρατσιστική αυταρχικότητα του κατεστημένου. Αγανακτούμε για τη διχαστική αντιδραστική φασιστική αντιλαϊκή αυταρχικότητα της ακροδεξιάς. Απορρίπτουμε την αντιλαϊκή καπιταλιστική ρατσιστική διασπαστική αντίδραση. Αγανακτούμε για την αλλοτριωτική φασιστική απειλή της λιτότητας και αποστομώνουμε την διχαστική επέλαση της παγκοσμιοποίησης. Υπερασπιζόμαστε την ισχυρή λαϊκή απελευθερωτική αντινεοφιλελεύθερη υπέρβαση. Αποστομώνουμε τη διχαστική αντιλαϊκή φασιστική αντιδραστική απειλή του κατεστημένου. Απομονώνουμε την αντιδραστική αντιλαϊκή αντιδημοκρατική διασπαστική νεοφιλελεύθερη αυταρχικότητα της ακροδεξιάς. Βοηθάμε τη ριζοσπαστική αντιρατσιστική διεθνιστική αντινεοφιλελεύθερη συσπείρωση. Είμαστε στην πρώτη γραμμή της απελευθερωτικής εργατικής αντιφασιστικής ριζοσπαστικής ηγεμονίας. Αντιπαλεύουμε την ιμπεριαλιστική απειλή και αντιστεκόμαστε στην αλλοτριωμένη νεοφιλελεύθερη απειλή της λιτότητας. Προωθούμε όλους τους διεθνιστικούς μαρξιστικούς ριζοσπαστικούς παλλαϊκούς αγώνες και αποστομώνουμε την καπιταλιστική απειλή του οικονομικού επεκτατισμού. Αρνούμαστε τη διασπαστική μονοπωλιακή ρατσιστική διχαστική απειλή της αντίδρασης. Απορρίπτουμε τη ρατσιστική ιμπεριαλιστική αντιδημοκρατική επέλαση της ακροδεξιάς και στηρίζουμε την ανανεωτική συνεργασία. Αγανακτούμε για τη φασιστική διχαστική ιμπεριαλιστική μονοπωλιακή επέλαση της λιτότητας. Είμαστε στην πρώτη γραμμή της αριστερής προοδευτικής αντινεοφιλελεύθερης αντιμονοπωλιακής ομοψυχίας. Σαν αριστεροί που εγκατέλειψαν θώκους και συντρόφους, θέλουμε την αντιμονοπωλιακή ενωτική προοδευτική αντινεοφιλελεύθερη ανανέωση. Απομονώνουμε την αντιλαϊκή αντιδημοκρατική αντιδραστική νεοφιλελεύθερη επέλαση του τεχνοφασισμού. Υποστηρίζουμε τη μαρξιστική λαϊκή διεθνιστική πατριωτική ηθική υπερηφάνεια. Αντιπαλεύουμε την αντιλαϊκή ρατσιστική διασπαστική αντιδραστική απειλή του οικονομικού επεκτατισμού. Είμαστε στην πρώτη γραμμή των αριστερών ανθρώπινων δικαιωμάτων και απομονώνουμε την μονοπωλιακή διασπαστική κατάντια της παγκοσμιοποίησης. Απορρίπτουμε την αντιδημοκρατική απειλή της παγκοσμιοποίησης και πετάξαμε στα σκουπίδια μίζες και υπουργεία για την σοσιαλιστική πατριωτική αγωνιστικότητα. Αγανακτούμε για την αλλοτριωμένη αντιενωτική ιμπεριαλιστική αντιλαϊκή διασπαστική απειλή της ακροδεξιάς. Είμαστε στις επάλξεις του επαναστατικού αντιφασιστικού εργατικού οικολογικού κινήματος. Αντιστεκόμαστε στην αλλοτριωτική διασπαστική ρατσιστική φασιστική μονοπωλιακή απειλή των μονοπωλίων. Απορρίπτουμε τη μονοπωλιακή καπιταλιστική αντιδημοκρατική νεοφιλελεύθερη επέλαση της λιτότητας. Οργανώνουμε την εργατική μαρξιστική αντικαπιταλιστική απελευθερωτική οικολογική ομοψυχία. Αποστομώνουμε την αντιενωτική αντιδημοκρατική διασπαστική καπιταλιστική αντιδραστική απειλή της παγκοσμιοποίησης και απορρίπτουμε την μονοπωλιακή επέλαση του κατεστημένου. *
PapaGen v1.05: RHETORIC TEXT GENERATOR by George A. Stathis (OMADEON)
Knowledge-base Topic: Pseudo-Ultra-Left Political Bullshit 2
Date: Sunday 20/2/2022, Time: 13:8:23. Developed in VISUAL PROLOG and Assembly X86

Number of Sentences = 50. Minimum Sentence Size = 7 Words. Time needed = 0.078 seconds

7

Αντιστεκόμαστε στη φασιστική αντιδημοκρατική αλλοτριωτική αντιλαϊκή ιμπεριαλιστική κατάντια του κατεστημένου και απορρίπτουμε την αντιδραστική επέλαση του τεχνοφασισμού. Εμείς, οι μόνοι συνεπείς πρωτοπόροι που αφήσαμε καρέκλες και επαίνους, αγωνιζόμαστε για την προοδευτική ενωτική αγωνιστικότητα και είμαστε στην πρώτη γραμμή της αντικαπιταλιστικής αντιμονοπωλιακής αριστεράς. Αντιπαλεύουμε τη διασπαστική μονοπωλιακή αυταρχικότητα του τεχνοφασισμού και υπερασπιζόμαστε τις απελευθερωτικές οικολογικές ιδέες. Καταγγέλλουμε την αντιδημοκρατική αντιενωτική αντιδραστική αλλοτριωτική αυταρχικότητα του τεχνοφασισμού. Αντιστεκόμαστε στη φασιστική αντιδραστική καπιταλιστική διασπαστική λιτότητα. Χαιρετίζουμε την πανευρωπαϊκή αντινεοφιλελεύθερη ηγεμονία και πολεμάμε την αντιδραστική κατρακύλα. Εμβαθύνουμε στο λαϊκό εργατικό οικολογικό κίνημα και είμαστε στην πρώτη γραμμή του ριζοσπαστικού κόμματος. Πολεμάμε την ιμπεριαλιστική καπιταλιστική αλλοτριωτική επέλαση και αρνούμαστε την αντιδημοκρατική λαίλαπα του συστήματος. Απομονώνουμε την αντιλαϊκή απειλή της παγκοσμιοποίησης και αγανακτούμε για την αντιενωτική φασιστική απειλή. Βοηθάμε όλους τους εργατικούς ριζοσπαστικούς ανανεωτικούς αγώνες και προτείνουμε τη δημοκρατική υπέρβαση. Αντιπαλεύουμε τη διχαστική ιμπεριαλιστική αντιενωτική διασπαστική ρατσιστική απειλή της παγκοσμιοποίησης και αγανακτούμε για την αντιδημοκρατική αυταρχικότητα της λιτότητας. Αντιστεκόμαστε στη ρατσιστική φασιστική καπιταλιστική μονοπωλιακή αυταρχικότητα της λιτότητας. Αρνούμαστε την αντιλαϊκή επέλαση της παγκοσμιοποίησης και είμαστε στην πρώτη γραμμή της ενωτικής αλληλεγγύης. Καταγγέλλουμε τη διασπαστική νεοφιλελεύθερη αυταρχικότητα του συστήματος και στηρίζουμε την ανανεωτική ριζοσπαστικοποίηση. Αρνούμαστε την ιμπεριαλιστική διχαστική αντιενωτική επέλαση του τεχνοφασισμού και αντιπαλεύουμε την φασιστική αντιδραστική αυταρχικότητα της λιτότητας. Προωθούμε την οικολογική αντικαπιταλιστική προοδευτική ανανέωση και καταγγέλλουμε την αντιδραστική αυταρχικότητα της λιτότητας. Θυσιάσαμε οφφίτσια και θέσεις για την ισχυρή πατριωτική αντιϊμπεριαλιστική δημοκρατική ανανέωση και αποστομώνουμε την φασιστική μονοπωλιακή αυταρχικότητα των μονοπωλίων. Αντιπαλεύουμε τη διχαστική αντιενωτική μονοπωλιακή καπιταλιστική αυταρχικότητα της αντίδρασης. Αντιστεκόμαστε στο διχαστικό μονοπωλιακό διασπαστικό αντιδημοκρατικό καθεστώς του κατεστημένου. Αγανακτούμε για τη ρατσιστική αντιενωτική μονοπωλιακή αντιδημοκρατική απειλή του κατεστημένου. Αντιπαλεύουμε την ιμπεριαλιστική μονοπωλιακή καπιταλιστική αντιδημοκρατική αντιλαϊκή φασιστική απειλή του τεχνοφασισμού. Αποστομώνουμε την αντιδημοκρατική αντιδραστική διασπαστική φασιστική αυταρχικότητα της δεξιάς. Αντιστεκόμαστε στην αντιδημοκρατική φασιστική αυταρχικότητα της ακροδεξιάς και καταγγέλλουμε την ρατσιστική απειλή του τεχνοφασισμού. Προτείνουμε την εργατική διεθνιστική πανευρωπαϊκή πατριωτική κινητοποίηση του λαού. Βοηθάμε την προοδευτική αγωνιστικότητα και αποστομώνουμε την αντιδραστική απειλή της παγκοσμιοποίησης. Θαυμάζουμε την πατριωτική αντιρατσιστική απελευθερωτική σοσιαλιστική ριζική αλλαγή. Αγανακτούμε για τη διχαστική ρατσιστική κατάντια της ακροδεξιάς και αρνούμαστε την καπιταλιστική απειλή της παγκοσμιοποίησης. Αποστομώνουμε τη διχαστική φασιστική διασπαστική καπιταλιστική απειλή των μονοπωλίων. Αντιστεκόμαστε στην αντιλαϊκή μονοπωλιακή λαίλαπα του συστήματος και σαν αριστεροί που εγκατέλειψαν επαίνους και υπουργεία, θέλουμε την πανευρωπαϊκή λαϊκή ριζική αλλαγή. Αγανακτούμε για την αντιλαϊκή απειλή του τεχνοφασισμού και αποστομώνουμε την διχαστική επέλαση της παγκοσμιοποίησης. Απομονώνουμε την καπιταλιστική διασπαστική ιμπεριαλιστική αντιδραστική απειλή της λιτότητας. Αποστομώνουμε τη ρατσιστική αλλοτριωτική αντιενωτική αντιλαϊκή απειλή του κατεστημένου. Υποστηρίζουμε τη δυναμική αντιφασιστική οικολογική προοδευτική συνειδητοποίηση. Πετάξαμε στα σκουπίδια οφέλη και υπουργεία για την πατριωτική αντιϊμπεριαλιστική αντιφασιστική σοσιαλιστική πανευρωπαϊκή απελευθερωτική αντινεοφιλελεύθερη αλληλεγγύη και αποστομώνουμε την ιμπεριαλιστική κατάντια της αντίδρασης. Προωθούμε την πατριωτική αντιϊμπεριαλιστική πανευρωπαϊκή εργατική φιλεργατική δημοκρατική ομοψυχία. Απομονώνουμε τη διχαστική αντιδημοκρατική αντιενωτική απειλή του τεχνοφασισμού και απορρίπτουμε τη διασπαστική απειλή των μονοπωλίων. Θυσιάσαμε θώκους και υπουργεία για τις σοσιαλιστικές πατριωτικές ανανεωτικές ενωτικές εργασιακές διεκδικήσεις και στηρίζουμε την αντιρατσιστική διεθνιστική υπέρβαση. Καταγγέλλουμε τη μονοπωλιακή αντιδημοκρατική ιμπεριαλιστική αντιλαϊκή επέλαση του οικονομικού επεκτατισμού. Καταγγέλλουμε την αντιενωτική μονοπωλιακή αντιδραστική ιμπεριαλιστική ακροδεξιά. Απορρίπτουμε τη διχαστική μονοπωλιακή αντιδημοκρατική νεοφιλελεύθερη απειλή της λιτότητας. Αντιπαλεύουμε την καπιταλιστική απειλή του κατεστημένου και αρνούμαστε την φασιστική απειλή της παγκοσμιοποίησης. Καταγγέλλουμε την αντιενωτική αλλοτριωτική ρατσιστική αντιλαϊκή επέλαση της αντίδρασης και απομονώνουμε την μονοπωλιακή αυταρχικότητα της παγκοσμιοποίησης. Αποστομώνουμε την αλλοτριωμένη αντιδραστική αλλοτριωτική επέλαση της παγκοσμιοποίησης και αγανακτούμε για την ιμπεριαλιστική αυταρχικότητα του τεχνοφασισμού. Θαυμάζουμε τη σοσιαλιστική αντιρατσιστική προοδευτική δημοκρατική αλληλεγγύη. Απομονώνουμε την αντιδημοκρατική διχαστική επέλαση του κατεστημένου και απορρίπτουμε την καπιταλιστική απειλή του οικονομικού επεκτατισμού. Αποστομώνουμε την αντιδραστική καπιταλιστική διχαστική νεοφιλελεύθερη αυταρχικότητα του οικονομικού επεκτατισμού. Απομονώνουμε την αλλοτριωμένη ιμπεριαλιστική μονοπωλιακή διχαστική απειλή της παγκοσμιοποίησης. Αποστομώνουμε τη μονοπωλιακή διχαστική ρατσιστική αντιδραστική λιτότητα. Προστατεύουμε τη ριζοσπαστική ηθική υπερηφάνεια και προτείνουμε τη σοσιαλιστική ανανεωτική πανευρωπαϊκή απελευθερωτική ηγεμονία. Αντιπαλεύουμε την αλλοτριωμένη φασιστική ρατσιστική αντιλαϊκή αυταρχικότητα. *
PapaGen v1.05: RHETORIC TEXT GENERATOR by George A. Stathis (OMADEON)
Knowledge-base Topic: Pseudo-Ultra-Left Political Bullshit 2
Date: Sunday 20/2/2022, Time: 13:8:46. Developed in VISUAL PROLOG and Assembly X86

Number of Sentences = 50. Minimum Sentence Size = 7 Words. Time needed = 0.109 seconds


May 8, 2009

Ultra-Fast Hybrid Genetic Algorithm in Assembly Language for the Travelling Salesman Problem (DLL for LPA Prolog)

UPDATE 2 (17 Feb. 2022): Traveling Salesman Problem (TSP) solved by a “Hybrid Genetic Algorithm” I had developed in Assembly Language and LPA Prolog (2009).

The same video on my YouTube channel (terminated for unknown reasons, on the same day my Gmail was hacked, 19/8/2021): http://www.youtube.com/watch?v=HvE5Ue971Cs (“Video Unavailable because the account was terminated…”).

I used this algorithm’s DLL inside a large-scale Scheduling Application for Multiple Tasks, in LPA WIN-Prolog. Some screen-shots from the program’s main window are shown in the following animated GIF:

O.G.T.S.P. Algorithm sample screen-shots

O.G.T.S.P. Algorithm sample screen-shots

Enhanced by Zemanta

February 15, 2009

Assembly Language for Visual Prolog Meta-programming

(This is an experimental repost – for testing purposes, using  Scribefire. Original post is here). (more…)

July 20, 2008

Assembly Language for Visual Prolog Meta-programming

Visual Prolog Integrated...Image via Wikipedia
Back in 2005, while working in large-scale programming projects for data-mining in G.I.S. and Hydrology, I wrote a Prolog interpreter called G.I.S. Prolog, equipped with many extra predicates (such as functions to locate points inside polygons, etc).The G.I.S. Prolog interpreter was originally based on the “PIE interpreter” (included as free source-code in Visual Prolog) but it ended up enhanced with many extra predicates, as well as an improved core-level inference mechanism.
Ever since I started using the Visual Prolog compilers (and the PDC Prolog compilers preceding them) I was fascinated by the possibilities of implementing additional ISO-Prolog functionality in Visual Prolog through Assembly Language and ‘C’. Of course, such attempts are inherently limited by the internal design of Visual Prolog compilers. So, the only way to implement ISO-Prolog functionality in Visual Prolog is to extend the “PIE Interpreter” (and G.I.S. Prolog as its offspring). A multitude of extra predicates, implemented in pure Assembly language, became available through G.I.S. Prolog for easy immediate experimentation: Coding in G.I.S. Prolog produced immediate results, without any need for (often tedious) EXE-file compilation. Code modifications could therefore be done very quickly and most mistakes were (semi-)automatically corrected by the interpreter’s own enhanced error-checking capabilities.

Recently, I discovered some Assembly language techniques to enhance G.I.S. Prolog even further, potentially valuable for a multitude of other purposes. They also have an intrinsic fascination in themselves, as general tools for Prolog meta-programming.

E.g. here is an Assembly language predicate, that takes as inputs another (external) predicate’s memory-address and a (Visual Prolog-) argument-list, and calls this (external) predicate, using the (arbitrary-length-) list of N arguments, as arguments of “arity N”:

apply_func(PRED, [Arg,Arg2,…]) <=> PRED(Arg1,Arg2,…)

Now, in ISO-Prolog there is a standard predicate known as “univ”, written as “=..“, which turns a list like [PRED,ARG1,ARG2,ARG3…] into a predicate call such as PRED(ARG1,ARG2,…). However, this does not exist in Visual Prolog, which sacrifices such “luxuries” for speed (which is the reason I also often use ISO-Prolog compilers, such as LPA-WinProlog and SWI-Prolog).

Anyway… The code you are about to see can be useful more generally, as an example of Prolog meta-programming, implemented in Assembly Language. The only difference between the way it works for Visual Prolog and the way it might work for another Prolog (or -indeed- ANY programming language, using a ‘C’-calling convention) is the Visual-Prolog-specific structure of a LIST, which in Visual Prolog has a different form than in all other languages. If you understand Assembly Language and intend to use this code for other (meta-programming) tasks, all you have to do is modify just a couple of lines in the code that follows. However, before you (even begin to) look at the Assembly Language Code, the following simple definitions in Visual Prolog (5.*) are a prerequisite for easier understanding:

GLOBAL DOMAINS
dom_iii = determ INTEGER (INTEGER,INTEGER,INTEGER)
 	-(i,i,i) language c % <-- example domain
GLOBAL PREDICATES
apply_func(DWORD,ListDomain) -(i,i) language c
% where arg-1 is a predicate-domain, such as "dom_iii"

After you compile the Assembly language code, you could create a simple “EasyWin” Visual Prolog project, with the following ines:

PREDICATES
 func2dword(dom_iii,DWORD) 
 % converts a predicate to a doubleword/address

 add3: dom_iii
CLAUSES
func2dword(FUNC,DW):- DW = cast(dword,FUNC).

add3(_X,_Y,_Z,Out):- Out = _X+_Y+_Z,
 	write("out = ",Out), nl, !
 	;
 	write("error!\n"), Out=-1, !.
GOAL
func2dword(add3,DW),
Out = apply_func(DW,[10,20,30]),
write("result = ",Out), nl, readchar(_).

%This program should produce "result = 60" (sum of [10,20,30]).

OK, so here is the Assembly language code:

; ==================== _apply_func.asm =====================
; Code for TASM 5 Assembler, command-line call for compilation:
; C:\TASM\BIN\TASM32.EXE /p /z /w2 /m2 /ml _apply_func.asm
IDEAL
P586
MODEL    flat
CODESEG
ALIGN 4
public _apply_func    ; (i,i)
PROC _apply_func near
ARG    func:dword, list:dword
LOCAL    fcnt:dword
ENTER 4,0
push    esi        ;
push    edi        ;
push    ebx        ;
push    ecx        ;
mov    ecx,[func]  ; function............ ARG 1
mov    esi,[list]  ; list................ ARG 2
xor    ebx,ebx     ; make EBX=0
mov    [fcnt],ebx  ; initialize local variable 'fcnt' to 0
lodsd              ; load the 1st list-element's "element-flag"
dec    al          ; decrement it, to check if it was a 1
jnz short @@x1     ; exit if not (i.e. if it's the list's end)
; ----------------- else...
@@L1:             ; loop to read the (Visual-Prolog-) arg-list
inc    ebx        ; increment ebx (counter for number_of_args)
lodsd             ; load next list-element (arg. of function)
push    eax       ; push it into the stack (for a function-call)
lodsd             ; load the pointer to next list-element in EAX
mov    esi,eax    ; now ESI = (pointer-to-) next list-element
lodsd             ; load element-flag of next list-element
dec    al         ; decrement it, to check if it was a 1
jz short @@L1     ; if so, not yet the list's end, so repeat!
; ================= else...
@@x1:
mov    [fcnt],ebx  ; store the number_of_args in local var. 'fcnt'
call   ecx         ; call the (external) function (given in ARG-1)
mov    ecx,[fcnt]  ; get the function's number of args from 'fcnt'
@@L2:
jcxz @@x2          ; if the called function had NO args, exit
; ------------------ else...
@@L3:              ; loop to POP function-args after the call
pop        edx     ; recover next argument from the stack
dec        ecx     ; decrement the remaining number_of_args
jnz short @@L3     ; if not zeroed, continue popping args...
; ------------------
@@x2:
pop        ecx     ;
pop        ebx     ;
pop        edi     ;
pop        esi     ;
LEAVE
ENDP _apply_func
end

NOTES:

  • A not-so-obvious advantage of this code is that any Prolog interpeters written on the basis of Visual Prolog’s “PIE engine” (such as G.I.S. Prolog) make extensive use of calls such as this, inside their inference engine; using Prolog-lists of arguments to be called by turning them into proper predicate calls of arity=N (where N is the size of the list). So, an Assembly language implementation of such a calling mechanism can speed up such an interpreter considerably, especially inside recursive calls or loops, which call other predicates repeatedly countless times…
  • Another not-so-obvious advantage is that -in this way- we managed to… trick Visual Prolog into doing “forbidden” predicate calls, such as PRED(arg1,arg2,….), where both the predicate’s functor and the arguments may appear as static data, stored in a Visual Prolog facts’ database.
  • Don’t ask me (yet) how to implement such tricks in Visual Prolog 6.* or 7.*; I still use the version 5.* compilers a lot, because of their speed, as well as robustness in foreign language calls.
Zemanta Pixie

October 14, 2007

DreamProver: A visual theorem prover for “Multiple Form Logic” (etc.) in LPA Win-Prolog 4.6

Chart showing the stages in the software relea...Image via Wikipedia

Visual DreamProver 1.0 is a new theorem-proving program, developed in LPA Win-Prolog 4.6, with multi-coloured graphics displays of (potentially unlimited) Logic expressions, theorem proofs and deductions in Multiple Form Logic, in the primary algebra of “Laws of Form“, in Boolean Algebra and in a variety of other logic systems (to a large extent used-defined). Here is an animated GIF slide-show of DreamProver’s visual display. It offers unlimited control of size, colour, shape and content for all Logic Expressions and all theorem proofs:

dreamprover430x.gif

(Click on this image for a better quality animated GIF, of size 450Kb)

Although DreamProver is still at the “alpha stage“, I decided to publish a preliminary first report about its features and capabilities, to a large extent already working, to a lesser extent requiring minor debugging and final extensions, before release. I am also doing this for the benefit (and amusement) of a friendly innovative company: “Logic Programming Associates Ltd”, where I worked for a short pleasant period of a few weeks, some years ago (in 2001). LPA are the creators of the LPA Win-Prolog compiler. I hope that LPA continues a long tradition of innovative success through the latest version of their compiler, which also has MIDI (music) programming capabilities (featured in a recent posting, here).

I am also… officially requesting, after the release of DreamProver (and the ensuing free promotion of LPA’s amazing compiler) a small… personal favour: -A legitimate free copy of their newest LPA Win-Prolog 4.7 compiler! 🙂 (as my license for using version 4.6 ends on the last day of 2007).

DreamProver is particularly suited for the display of so-called “Boundary Logic Systems” (first created by George Spencer Brown in “Laws of Form” and then extended by various people in various ways – including my own “Multiple Form Logic” system). However, its (almost unlimited) potential allows the display of many other logic systems, including Parse-Trees of used-defined grammars, since both the shapes and the data-structures they represent can be redefined “on the fly”. In the display shown above, only a small example of a logic expression is used, mainly to demonstrate graphics capabilities. However, if -for example- the Grammar of a subset of English is used, instead of a Logic Expression, the ensuing graphic display of coloured shapes resembles a tree which is symmetric with respect to a “horizon” line in the middle.

The data-structure for this unusual kind of tree-representation is relatively simple, straight-forward and documented (in the final release of DreamProver). It is separate from the internal Logic representation but related to it through specific user-defined rules: Both the “productions” and the “leaves” of such a grammar tree are user-defined in shape and content. The only difference between other kinds of systems and those built-in (as regards the current first version of DreamProver) is that the other systems do not include internal Proof Algorithms and automated deductions, and can only be fed from the results of such processes (through external third-party software). Before final release it is hoped that the input-expressions in other systems are expressed in standard XML, so as to make the software useful to almost any researcher or developer, in any topic that includes parsed tree-expressions. The ultimate goal is also to develop a kind of Universal DreamProver library, available under a professional license to developers for a small fee (that might help sustain this work and pay for the effort of future upgrades). However, the current version of DreamProver is likely to appear as Open Source in the near future. Keep in touch!

Zemanta Pixie

September 27, 2007

reading/writing/sorting Prolog variables, using the original variable-names (LPA Prolog code)

Filed under: LPA Win-Prolog, Prolog, source code — Omadeon @ 2:17 pm

Typically, Prolog variables are assigned by the compiler “internal names”, so that it is impossible to sort them using their original names (those provided by the user or by an input file).

However, in LPA Win-Prolog it is possible to preserve the original variable names, as well as sort them on the basis of these names. Finally it is also possible to retrieve the variables with their original names. Some examples follow:

1) LPA Prolog has predicates handling variable names (eread/2 and eprint/2). E.g. if you want Prolog to read a term with variables, preserving user-given variable names and then printing them out, you can use code like this:

| ?- eread(EXP,Vars), nl, eprint(EXP,Vars), nl, nl, nl.
|: this(THING,V,X,W).
this(THING,V,X,W)
EXP = this(_38218,_38220,_38226,_38232) ,
Vars = [('THING',_38218),('V',_38220),('X',_38226),('W',_38232)]
| ?-  

In LPA Prolog, eread/2 reads a term with variables and the it produces a list of names-and-variables [(Name,Var)|…] as a second argument. This has elements like (‘THING’,_38218) -in this example- where ‘THING’ is the user-defined variable name and _38218 is an “internal variable code”, generated by the compiler. The second predicate eprint/2 is similar: If the second argument of eprint/2 is bound to the names-and-variables-list (extracted previously) then the result is a printout of the expression as it was originally entered, preserving all the user-defined variable names.

Now, here is another example, only slightly more complicated. This time, it uses a small source-code file, which you can create easily, by copying and pasting the code that follows into a text file (of extension ‘.pl’).

The program asks the user to type a list (consisting of variables and constants) and then it is required to sort the variables, finally printing-out the resulting list with Variables sorted, but with names exactly the same as those typed originally. So, here is a piece of code that reads such a list from a user-prompt, sorts the list with respect to its variables, and then prints out the resulting list, with all the variables sorted:

test:- repeat, write('type a list of variables and constants:'), nl,
    eread(List,VL), sort(VL,VLsorted), sort(List,List1), varsort(List1,VLsorted,ListOut),
    write('sorted w.r.t. variables: '), eprint(ListOut,VL), nl, 
    write('press escape to exit, any other key to go on: '), get0(CHAR), CHAR = -1, !.
removevar(V,[A|L],L):- V == A, !.
removevar(V,[A|L],[A|Lx]):- removevar(V,L,Lx).

varsort([],_,[]):- !.
varsort(L,[],L):- !.
varsort(L,[(_Name,V)|VL],[V|XL]):-  removevar(V,L,L2), !, varsort(L2,[(_,V)|VL],XL).
varsort(L,[_|VL],XL):- !, varsort(L,VL,XL).

This piece of code is complete; you can copy it, paste it to a file ando compile it in LPA Win-Prolog. After doing this, type ‘test’ at the Prolog prompt. You will get a dialogue such as this:

| ?- test1.
type a list of variables and constants:
|: [A,D,C,2,B,34,X,F,D].
sorted w.r.t. variables: [A,B,C,D,F,X,2,34]
press escape to exit, any other key to go on: |:
yes
| ?-

The main predicate ‘test’ calls ‘eread/2’, which reads user- (or file-) input expressions and parses them into Prolog terms with variables. Then the variable-name-list is sorted. The original list is also sorted, and then the sorted variable names’ list is used to rearrange the sorted original list a second time, this time sorting it as regards variable names.

A very crucial predicate here is ‘removevar/3’, which is similar to the built-in predicate ‘remove/3’, removing an element of a list and producing the list without this element each time it’s called. However, unlike the built-in predicate ‘remove/3’, this one only deletes list-elements which are “identical to the first argument”, without doing any unification. I.e. it is capable of removing variables, if they exist in the list (of arg 2) but does not confuse them with other variables through unification.

Another new predicate in the code above is ‘ varsort’. It assumes that arg-1 contains an input-list (a mixture of variables and constants) and it makes use of the sorted list of variable names, to rearrange the list so that all the variable names are sorted, in the third (output-)argument:

[A,D,C,2,B,34,X,F,D] becomes [A,B,C,D,F,X,2,34] .

As an exercise, if you have some Prolog experience you can now try to write a similar piece of code that works on ANY kind of Prolog term, not just a list. If you do write such code, you can also send it as a comment in this posting, or an e-mail to omadeon@hotmail.com (with your name and any other details you’d like to see included), and I will publish it in this blog (with your name or alias) exactly as you’ve written it (provided of course that… it works 🙂 )!

September 22, 2007

LPA Win-Prolog: A professional Prolog compiler with unique features

In early 2001, I had the pleasure of working closely together with a friendly bunch of people, the creators of LPA Win-Prolog, for a a period of a few months: This company, who made LPA Win-Prolog is “Logic Programming Associates“, a group of dedicated developers and computer scientists led by Brian Steel, who also happens to be a musician and an orchestra conductor. A long time ago (in the eighties) Brian Steel had caused quite a stir in the so-called “home computer” industry, by writing the first Prolog compiler that could run on a ZX Spectrum, a machine with only 48Kb of RAM and a Z80 8-bit processor. At that embryonic stage of the computer industry’s evolution, it was considered impossible to cram a working Prolog compiler in only so little RAM and in such a slow computer. However, Brian Steel was also an Assembly Language programmer (just like me -although long before my time). He still writes very efficient Assembly Language code (today for Intel Pentiums – 32-bit and 64-bit code) which empowers today’s LPA compiler with a tremendous speed, compared to its rivals. Brian also thought deeply about the best way to implement certain commonly needed operations (such as string search) and so he set out to improve the ISO-prolog-compatible LPA compiler with special and unique instructions that increase its speed and efficiency even more (e.g. the multi-faceted predicate “find/3“).

Well, I am still using LPA Win-Prolog, ever since that happy period of a few months I spent in the UK, back in 2001, as an employee of LPA Ltd. In fact, I was forced to return to Greece because of a bad accident (a broken tendon in a foot), otherwise I’d rather stay in the UK and work with LPA… forever! BTW, Brian Steel is also -like me- a winter swimmer, in the English sea (in Cornwall) making it even more apealling for me -at the time- to… follow his example. 🙂

The latest versions of LPA Prolog (version 4.6 is the one I use at the moment) are full of extra goodies, such as a coloured syntax editor, a nice dialog editor (for the visual design of menus, windows, dialog boxes, etc), and so on. (Not to mention several good extra packages, included in the compiler, such as Flex, Datamite, Proweb, Chimaira Agents, and so on; you can read all about them in LPA Prolog’s site, here).

My only complaint is that (at the moment) the LPA package does not include a Constraints programming extension, (such as CLP, CLP/fd, CHR, etc). However, I plan to adapt some open source code for such extensions and include it inside LPA Prolog, in the near future. Unless -of course- this innovative company has already embarked on a similar project, adding to their compiler Constraints handling extensions. Finally, the very latest (recently announced) next version of LPA Prolog includes something very special, which is useful to musically inclined programmers and hobbyists: A midi interface!

I was probably among those people who first proposed to Brian Steel -back in 2001- that a midi interface would prove to be very popular, as well as a way to expand LPA’s customer base even further. At the time (2001), most of their customers were academics, universities and serious professional people. Today (2007) my guess is that their clients begin to be also musically oriented hobbyists and computer-literate composers. I -for one- (as a composer and remixer) can’t wait to get my hands on this new version of their compiler, since it’s the best way to experiment with L-systems for computer music generation, Prolog-based grammars for parsing and analysing existing MIDI music pieces, and so on.

However, now that the MIDI music Logic Programming client-base of LPA Prolog is beginniing to grow, the issue of Constraints extensions can no longer be neglected. Some of the best work in musical Artificial Intelligence is already using Constraints programming methods.

In this blog, I hope to write quite often about programming projects and experiments with LPA Win-Prolog, including my own (public domain) source-code. In addition, you can browse some professional projects implemented with LPA Prolog in recent years (2001-2005), in my source-code and programming projects’ page.

Finally, there are some rather unusual web-pages I wrote a few years ago, with tips and free code to combine LPA Win-Prolog, with… one of its rivals (PDC/Visual Prolog). At the time, it became evident that it was perfectly possible to combine the best features of both these professional compilers, so the title of the main web-page about this work was “A tale of Two Prologs“.

September 21, 2007

Reading EXCEL CSV-files as Prolog Clauses (SWI-Prolog source-code)

stylized depiction of a csv text file
Image via Wikipedia

If you need to convert into Prolog terms “raw data” supplied in EXCEL csv-files, read on! The source code in this posting will read any CSV file, converting each semicolon-delimited line (or record) of the CSV file into a Prolog clause, asserted in RAM. It is also possible to use the same code to read data deliberately provided (e.g. by another application) as a CSV-file, but which is specifically intended for use as a set of Prolog clauses.

This code also uses a couple of specification predicates: time_field_type/1, field1_as_functor/1, and conv_csvhead/2. These predicates control the behaviour of the conversion process, as follows:

time_field_type/1 :

  • time_field_type(0). In this case, time-fields in the CSV file (of the form “HH:MM” or “HH:MM:SS…”) are translated into minutes, ignoring seconds or hundredths of a second.
  • time_field_type(1). In this case, time-fields in the CSV file (of the form “HH:MM” or “HH:MM:SS…”) are translated into seconds, ignoring hundredths of a second.
  • time_field_type(2). In this case, time-fields in the CSV file are kept as they are, as atoms (e.g. ’03:35′, ’12:45:20′, etc).

field1_as_functor/1:

  • field1_as_functor(0): Each line in the CSV-file is interpreted as a prolog clause, where the functor of the clause is the first field of the record, and the other fields are arguments.
  • field1_as_functor(foo) (where ‘foo’ can be any atom): Each line in the CSV file is interpreted as a prolog clause, where the functor of the clause is foo (or any atom supplied as 1st argument to field1_as_functor/1) and all the fields are arguments.

conv_csvhead/2:

  • This predicate is used to convert the contents of the first field (of the CSV-file) into a (user-defined) internal Prolog representation. It is used only if “time_field_type(0)” exists. For example, to convert records where the first field is a Prolog functor ‘job’ but the actual contents of this field are ‘j’ (for brevvity), using a definition “conv_csvhead(j,job)” will convert each ‘j’ into a functor ‘job’. (Use of conv_csvhead/2 is optional; in the default case, it does nothing!)

Finally, some notes:

  • The main predicate to call is “loaddb(CSVfile)“, where CSVfile can be e.g. “test.csv”.
  • Provision has been taken for special fields which contain Lists of items, comma-delimited. In EXCEL these fields will appear as longish strings, but this code was written to parse them as Prolog atom-lists. (Comment-out this section if you don’t need it).
  • The only type of field that is currently not converted into any meaningful internal representation is DATE. Dates are converted to atoms, just as they appear, without parsing their actual contents. (As an exercise, you can re-use parts of the same code to parse date-fields!) The honest reason for this omission is that… I didn’t need dates (in an application I am developing, for which this code was also written).

The source-code follows. There are useful comments inside this code. You can just copy and paste what follows from this point onwards, into a text file saved for compilation by SWI-Prolog, ending in “.pl”: (more…)

September 20, 2007

SWI-Prolog source code: Converting hours-and-minutes to integers (e.g. for use in CLP)

Filed under: CLP, Conversions, Prolog, source code, SWI-Prolog, time-predicates — Omadeon @ 5:31 pm

This short posting is about a useful piece of SWI-Prolog code I keep (re-)using, ever since I wrote it. It is a predicate that converts time (in an EXCEL-compatible format ‘HH:MM’ or ‘HH:MM:SS’) to integers expressing minutes only, e.g. integers suitable for use in CLP applications (Constraints Logic Programming over finite integer domains). I am developing a serious CLP application, during the last few weeks and I regard the following (bi-directional) conversion code as indispensable:

%%% Conversion of Hours-and-minutes to integers and vice-versa (e.g. for CLP problems)
%%% converts number of minutes to a valid time-string e.g. '03:05':
mins2hourmin(MINS,OUTX):- nonvar(MINS), MINS > 0,
    Hours is MINS // 60, Minsx is MINS mod 60,
    num2str2(Hours,S1x), num2str2(Minsx,S2x),
    swritef(OUTX,'%w:%w',[S1x,S2x]), !
    ;
    MINS = 0, OUTX = '00:00', !.
mins2hourmin(HMINx,HRi):- nonvar(HRi),
    sub_atom(HRi,0,2,_,A1x), atom_number(A1x,HOURx),
    sub_atom(HRi,3,2,_,A2x), atom_number(A2x,MINSx),
    HMINx is MINSx + 60*HOURx, !.
mins2hourmin(MINS1,OUTX):- nonvar(MINS1), MINS1 < 0,
    MINS is -MINS1,
    Hours is MINS // 60, Minsx is MINS mod 60,
    num2str2(Hours,S1x), num2str2(Minsx,S2x),
    swritef(OUTX,'-%w:%w',[S1x,S2x]), !.
%% the same predicate operating on Lists of time-entities: 
mins2hourmin_list([],[]):- !.
mins2hourmin_list([M|ML],[X|XL]):- mins2hourmin(M,X), !, mins2hourmin_list(ML,XL).


%%% an auxilliary predicate for mins2hourmin/2:
num2str2(N,Sx):- N >= 10, swritef(Sx,'%w',[N]), !
    ;
    swritef(Sx,'0%w',[N]), !.

	

Bridging gaps between Prologs (SWI-Prolog predicates implented in LPA Win-Prolog)

Filed under: Code Conversion, LPA Win-Prolog, Prolog, source code, SWI-Prolog — Omadeon @ 4:36 pm

Today I spent too much time trying to force a SWI-Prolog project (of timetable scheduling, custom-made for a specific company) to run in a different compiler: LPA Win-Prolog. I needed badly to use certain graphics routines and other goodies of LPA Prolog (a commercial compiler), entire volumes of them in fact. So, I ended up writing code in LPA Prolog that implements some quite common SWI-Prolog predicates. Here are some of them:

The SWI-Prolog predicate ‘between/3’ generates (non-deterministically) a number, ranging from a minimum value to a maximum Value (as ‘bound’ 1st and 2nd arguments). I.e., in the SWI-Prolog console:

?- between(1,3,X).
X = 1 ;
X = 2 ;
X = 3 ;

Well, here is an LPA Win-Prolog implementation of this predicate (also valid in any other ISO-compatible Prolog):

between(Min,_,Min).
between(Min,Max,Out):- M2 is Min+1, M2 =< Max, between(M2,Max,Out).

OK, This was an easy example, while most probably the same code already exists in elementary Prolog textbooks. Here are some other (not-so-obvious) examples:

In LPA Prolog there are some very special, very efficient unique commands, like ‘find/3, which operates on ‘input streams’ to locate (sub-)strings inside them. Now, the so-called ‘input stream’ can itself (effectively) be just another string (turned into a stream through the special LPA command ‘<~’). The use of this predicate, ‘find/3’ to write quickly efficient code for non-deterministic search (of substrings inside larger strings) is a natural happy consequence. E.g.

findsubs(SubSTR,STR,Px):- len(SubSTR,Len), findrep(SubSTR,Len,Px) <~ STR.

findrep(_,Len,Px):- inpos(EndP), EndP > 0, Px is EndP-Len.
findrep(SubSTR,Len,Px):- find(SubSTR,0,Sx), +Sx=``, findrep(SubSTR,Len,Px). 

I wrote this code after understanding the (well-documented) similar non-deterministic predicate ‘replace’ (not a built-in command but given as simple source-code in LPA-Prolog’s Reference Quide, page 226). The reason I wrote it is because I needed it as a sub-predicate to implement of SWI-Prolog‘s superb predicate ‘sub_atom‘. (This was already used -alas in several places- inside the SWI-Prolog project, which was to be converted into LPA WIn-Prolοg).So, here is the resulting LPA-Prolog implementation of ‘sub_atom‘, valid for (almost) all possible flow-patterns (at least those used in my project, plus a few more):

/*********************************************************************************************
(a description of sub_atom/5 from SWI-Prolog's Open Source documentation):
sub atom(+Atom, ?Before, ?Len, ?After, ?Sub)
    ISO predicate for breaking atoms. It maintains the following relation: Sub is a sub-atom of Atom
    that starts at Before, has Len characters and Atom contains After characters after the match.
?- sub_atom(abc, 1, 1, A, S).
 A = 1, S = b
   The implementation minimises non-determinism and creation of atoms. This is a very flexible
   predicate that can do search, prefix- and suffix-matching, etc.
**********************************************************************************************/
% HERE is my LPA Win-Prolog (exact) implementation of 'sub_atom/5':
%%%%%%%%%% (also valid in most other ISO-ish Prologs) %%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% (i,i,i,o,o)
sub_atom(Atom,Start,Len,LenAfterX,SubX):-
   nonvar(Atom), nonvar(Start), nonvar(Len), var(LenAfterX), var(SubX),
   cat(Lx,Atom,[Start,Len]), Lx = [_,SubX,End], len(End,LenAfterX).
% (i,o,i,i,o)
sub_atom(Atom,Start,Len,LenAfter,SubX):-
   nonvar(Atom), nonvar(Len), nonvar(LenAfter), var(Start), var(SubX),
   len(Atom,LenTotal), Start is LenTotal - LenAfter - Len,
   cat(Lx,Atom,[Start,Len]), Lx = [_,SubX,_].
% (i,o,o,o,i)  (effectively a non-deterministic search-function)
sub_atom(Atom,Startx,SubLenx,LenAfterX,Sub):-
   nonvar(Atom), nonvar(Sub), var(SubLenx), var(LenAfterx), var(Startx),
   len(Sub,SubLenx),  atom_string(Atom,STR), atom_string(Sub,SubSTR), len(STR,Slen),
   findrep(SubSTR,SubLenx,Startx) <~ STR, LenAfterX is Slen-Startx-SubLenx.
% where 'findrep/3' was written previously as a part of 'findsubs' (top of this post).
%(i,i,o,o,o)
sub_atom(Atom,Start,Len,LenAfterX,SubX):-
   nonvar(Atom), nonvar(Start), var(Len), var(LenAfterX), var(SubX),
  cat(Lx,Atom,[Start]), Lx = [_,End], len(End,Len2),
  between(0,Len2,Lenx), cat(Lxx,End,[Lenx]),
  Lxx = [SubX,End2], len(End2,LenAfterX), Len=Lenx.
%(i,o,o,o,o)
sub_atom(Atom,Start,Len,LenAfterX,SubX):-
   nonvar(Atom), var(Start), var(Len), var(LenAfterX), var(SubX),
   len(Atom,Len1), between(0,Len1,Pos),
  cat(Lx,Atom,[Pos]), Lx = [_,End], len(End,Len2),
  between(0,Len2,Lenx), cat(Lxx,End,[Lenx]),
  Lxx = [SubX,End2], len(End2,LenAfterX), Len=Lenx, Start=Pos.
%(i,o,i,o,o)
sub_atom(Atom,Start,Len,LenAfterX,SubX):-
   nonvar(Atom), var(Start), nonvar(Len), var(LenAfterX), var(SubX),
   len(Atom,Len1), LenPre is Len1-Len, between(0,LenPre,Pos),
  cat(Lx,Atom,[Pos,Len]), Lx = [_,Mid,End],
  SubX = Mid, LenAfterX is Len1-Pos-Len, Start=Pos.

%%%%%%%%%% (end of code) %%%%%%%%

Well, that’s it, for the moment, I’m afraid.

I must go back to my project now, but (rest assured) I will be coming back here, soon, again and again, and again…

Blog at WordPress.com.