Pyke

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Mungo1981
User
Beiträge: 131
Registriert: Montag 27. August 2012, 19:05

Liebe Community,
Ich arbeite mich gerade in Pyke ein.
Pyke ist eine Library / Modul um unter Python Prolog also logische Programmierung zu erreichen
:D Nun bin ich auf der Suche nach gleich gesinnten
Und nach Menschen die schon etwas Ahnung in der Matterie haben :D

Ein gut gelaunter

Mungo 1981

8) P.S.: Gut gelaiunt :== (weil ) Erstes eigene Pyke Anwendung läuft 8)
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Mungo1981: Von Pyke habe ich leider kaum Ahnung. Das hatte ich mir nur mal kurz angesehen, als ich die Möglichkeiten zur Logikprogrammierung in Python recherchiert habe. Keine davon war genau das was ich wollte und weil ich sowieso einen naiven Prologinterpreter in Python geschrieben hatte, habe ich dort einfach den Prologparser ausgebaut und das ganze zur eingebetteten DSL für Python 3.4 umgebaut. Die Bibliothek heißt hornet (= horn clauses via expression trees) und zu finden ist sie hier: https://github.com/pillmuncher/hornet/t ... t/examples. Leider gibt es bisher keinerlei Dokumentation, nur ein paar Beispielprogramme, wie man es verwenden kann. Hier ist eines, n-queens:

Code: Alles auswählen

from hornet import Database, let, select, _, arithmetic_not_equal


from hornet.symbols import (
    queens, solution, noattack, Rest, Ns, S, X, Y, X1, Y1, Xs, Ys, Y0s, Qs,
)


def main():

    db = Database()

    db.tell(

        queens(S) <<
            let(Ns, [i + 1 for i in range(6)]) &
            solution(Ns, Ns, [], S),

        solution([X|Xs], Y0s, Qs, [X/Y|S]) <<
            select(Y, Y0s, Ys) &
            noattack(X/Y, Qs) &
            solution(Xs, Ys, [X/Y|Qs], S),
        solution([], _, _, []),

        noattack(X/Y, [X1/Y1|Rest]) <<
            arithmetic_not_equal(Y, Y1) &
            arithmetic_not_equal(Y1 - Y, X1 - X) &
            arithmetic_not_equal(Y1 - Y, X - X1) &
            noattack(X/Y, Rest),
        noattack(_, []),

    )

    for subst in db.ask(queens(S)):
        print(subst[S])


if __name__ == '__main__':
    main()
Ergebnis:

Code: Alles auswählen

[1 / 2, 2 / 4, 3 / 6, 4 / 1, 5 / 3, 6 / 5]
[1 / 3, 2 / 6, 3 / 2, 4 / 5, 5 / 1, 6 / 4]
[1 / 4, 2 / 1, 3 / 5, 4 / 2, 5 / 6, 6 / 3]
[1 / 5, 2 / 3, 3 / 1, 4 / 6, 5 / 4, 6 / 2]
Pythons Operatorsymbole sind ja eher spärelich und können nicht wie in Prolog um eigene erweitert werden, deswegen habe die ich wichtigsten durch andere ersetzt, als man sie aus Prolog kennt: << statt :-, statt der Konjunktion mittels , verwende ich &. Andere, wie arithmetische Vergleichsoperatoren, bekommen einfach Namen wie arithmetic_not_equal, und so weiter. Das steht alles in hornet.__init__._bootstrap().

Wenn du es ausprobieren magst, kann ich gerne über die Feiertage ein wenig Dokumentation schreiben. Bísher hatte ich das nicht gemacht, weil ich es mehr als proof of concept angesehen angesehen hatte, aber vielleicht ist es ja zu mehr zu gebrauchen. Gib einfach bescheid.
In specifications, Murphy's Law supersedes Ohm's.
Antworten