Запись в файл | Сви-пролог | Windows - PullRequest
2 голосов
/ 19 января 2011

Некоторые скрипты работают успешно с помощью swi-prolog 5.11.11 на linux-системе, но не очень хорошо на windows-системе на Swi-Prolog 5.6.48

main :-
    open('output.txt',write,OS),
    elements(Points),
    get_set(Eq, Points),
    alpha_isotone(Eq, Points),
    write(OS,Eq),nl(OS),
    false,
    close(OS).

Проблема - в файле Windows output.txt пусто и вся информация остается в псевдотерминале. Под Linux это работает хорошо, но конец файла часто пропускается. Как

>> tail output.txt      
[6,1,3,6,6,6]
[6,1,6,6,6,6]
[6,3,1,6,6,6]
[6,3,3,6,3,6]
[6,3,3,6,5,6]
[6,3,3,6,6,6]
[6,3,6,6,6,6]
[6,6,1,6,6,6]
[6,6,3,6,6,6]
[6,6,6,

Что я делаю не так? (кроме моего английского)

Ответы [ 2 ]

3 голосов
/ 19 января 2011

Если кто-то хочет сохранить закрытие (ОС) в «одиночном» предложении main / 0 , это также работает:

main :-
    open('output.txt',write,OS),
    (   elements(Points),
        get_set(Eq, Points),
        alpha_isotone(Eq, Points),
        write(OS,Eq),nl(OS),
        false
        ;
        close(OS)
    ).

Этот синтаксис не рекомендуется, так какТрудно вспомнить, что является приоритетом конъюнкции , по сравнению с дизъюнкцией ;, если только вы не часто используете такое кодирование, и на этом счете она менее читаема, чем версия, представленная larsmans.

Пролог определяет относительный приоритет операторов, даже для AND, OR и "neck" :-, назначая значения Precedence каждому (пользователи делают это с помощью op /3 (при определении их собственных операторов), в диапазоне от 0 до 1200.

Здесь также наблюдается изменение обычного соглашения , в котором мы обычно подразумеваем, что оператор с более высоким приоритетомприменяется перед операторами с более низким приоритетом.Но в Прологе нижнее Приоритетное значение указывает на то, что оператор связывается (применяется) первым.

Фактические значения приоритета зависят от реализации, но соединение , имеет меньшее Старшинство значение, отличное от дизъюнкции ; и, таким образом, связывается первым.

2 голосов
/ 19 января 2011

Я предполагаю, что это должен был быть отказоустойчивый цикл. Он не работает, потому что вызов close/1, как говорит @hardmath, никогда не достигается, так как ему предшествует fail/1 в том же пункте. Фактически выходной файл, по-видимому, не очищен. Этот отказоустойчивый цикл должен быть записан как:

main :-
    open('output.txt', write, OS),
    main(OS).

main(OS) :-
    elements(Points),
    get_set(Eq, Points),
    alpha_isotone(Eq, Points),
    write(OS,Eq), nl(OS),
    false.
main(OS) :- close(OS).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...