Найти наибольшее значение с потоковой передачей текста - PullRequest
2 голосов
/ 07 марта 2012

Мне нужна программа, которая может распознавать наибольшее значение в тексте. Сначала передайте текстовый файл в нем и

Я получаю информационный символ за символом, но не могу выполнить вычисление и результат, независимо от того, квадрат это или нет. Если он квадратный, укажите число в координатах sample.txt.

    setup:-process('sample.txt').
process(File) :-
        open(File, read, In),
        get_char(In, Char1),
        process_stream(Char1, In),
        close(In).

process_stream(end_of_file, _) :- !.
process_stream(Char, In) :-
        get_char(In, Char2),
        look(Char,Char2), 
        process_stream(Char2, In).

1 Ответ

2 голосов
/ 07 марта 2012

В Prolog более простым в использовании инструментом анализа ввода является расширение, называемое DCG (Определенная грамматика раздела).Благодаря своей простоте он доступен практически в любой системе.

Используя эту возможность, встроенную read_line_to_codes и утилиту integer // 1 мы можем написать:

:- [library(readutil),
    library(http/dcg_basics)].

setup :- process('sample.txt').

process(File) :-
    open(File, read, Stream),
    repeat,
    read_line_to_codes(Stream, Codes),
    (   Codes == end_of_file
    ->  close(Stream), !
    ;   phrase(check_rectangle, Codes, _), fail
    ).

% just print when |X2-X1|=|Y2-Y1|, fails on each other record
check_rectangle -->
    integer(X1), ",", integer(X2), ",",
    integer(Y1), ",", integer(Y2),
    {   abs(X2-X1) =:= abs(Y2-Y1)
        ->  writeln(found(X1,Y1,X2,Y2))
    }.

Вывод (я добавил увеличенный прямоугольник только для проверки):

?- setup.
found(10,30,20,40)
found(100,300,200,400)
true.
...