Piszę wrapper dla interpretera Prologa z innego języka programowania. Nie wchodzę w szczegóły, ale generuje on zasadniczo zgodny program Prolog i przekazuje program do interpretera ze standardowego wejścia. Jestem stosunkowo nowy w Prologu.Kończenie [użytkownik]. ze znakiem EOT w Prologu
Problem polega na tym, że nie mogłem znaleźć specyfikacji dla terminu [user].
, który odczytuje reguły ze standardowego wejścia. W szczególności, w jaki sposób wykrywa koniec danych wejściowych.
Najbardziej intuicyjnym sposobem osiągnięcia tego jest wysłanie znaku EOT (Ctrl-D), ale wydaje się, że nie działa. Poniżej znajduje się przykładowy przykład, zamień znak^D na rzeczywisty znak EOT. Załóżmy, że ten plik jest zapisany w input.pl
. Zamierzam wygenerować taki kod programowo i przekazać go do procesu prologu tła poprzez standardowe wejście.
[user].
factorial(0,1).
factorial(N,F) :- (>(N,0),is(N1,-(N,1)),factorial(N1,F1),is(F,*(N,F1))).
^D
factorial(3,W).
Kiedy biegnę cat input.pl | <prolog>
gdzie <prolog>
jest cokolwiek Prolog tłumacza (swipl, Yap, itd.), Nie wydaje się, aby rozpoznać^D. Dlaczego tak jest i jak mogę to rozwiązać? Na terminalu^D działa dobrze.
Powyższy przykład ma zwrócić wartość "W = 6". SWI narzeka Syntax error: illegal_character
. Yap wydaje się ignorować^D, po prostu parsować wszystko i wracać yes
.
Oczywiście mogę zapisać program na tymczasowym pliku i poprosić tłumacza o sprawdzenie pliku, ale jest wolny.
EOF to nie to samo, co strumień znajdujący się na końcu pliku lub zamknięty. '[user] .' mówi Prologowi, aby czytał od użytkownika, dopóki strumień się nie skończy lub nie zostanie zasygnalizowany koniec pliku. Terminal konwertuje Ctrl-D użytkownika na ten sygnał. To nie jest literał, który pojawia się w strumieniu wejściowym. W przeciwnym razie, w jaki sposób byłby w stanie "cat" plik z znakami EOF w nim? –
Zobacz [tę odpowiedź] (https://stackoverflow.com/a/9091262/812818). –
Nie EOF, EOT. Nie oczekuję, że "[user]." Wykryje EOF. –