2017-11-07 11 views
5

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.

+1

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? –

+0

Zobacz [tę odpowiedź] (https://stackoverflow.com/a/9091262/812818). –

+0

Nie EOF, EOT. Nie oczekuję, że "[user]." Wykryje EOF. –

Odpowiedz

5

Powiedz end_of_file. zamiast ^D. Działa to w wielu implementacjach Prologu, ponieważ ich rzeczywisty odczyt jest wykonywany z read/1. Historycznie, od DECsystem 10 Prolog on, systemy miały tylko read/1, ale nie miały at_end_of_stream/0 i powiązanych wbudowanych predykatów. W rzeczywistości niektórzy programiści używali end_of_file. w pliku źródłowym Prolog, aby zezwolić na dołączanie dowolnego tekstu do źródła Prolog.