Количество положительных и отрицательных чисел в файле Visual Prolog

      Комментарии к записи Количество положительных и отрицательных чисел в файле Visual Prolog отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на строки и файлы Количество положительных и отрицательных чисел в файле Visual Prolog

Помечено: , ,

В этой теме 4 ответа, 3 участника, последнее обновление  Васильев Владимир Сергеевич 9 мес., 2 нед. назад.

  • Автор
    Сообщения
  • #2930

    Anechka
    Участник

    Помогите исправить пожалуйста программу на Visual Prolog 5.2:

    Составить правило, которое проверяет, выполняется ли свойство:
    что отрицательных элементов некоторого файла больше, чем положительных. Числа в блокноте пишем любые

    predicates
      file_read(integer, integer, string)
    clauses
      file_read(K,T,Z):-
        not(eof(f1)), 
        readint(X), 
        X > 0,
        K1=K+1, 
        T1=T+1, 
        not(eof(f1)),   
        file_read(K1,T1,Z); 
        K1 > T1, Z=("Да"); 
        Z=("Нет"); 
        closefile(f1).
    goal 
        openread(f1,"D:/2.txt"), 
        readdevice(f1),
        file_read(0,0,T), 
        write(T).

  • #2931

    Код весь не правильный. Часть проблем удалось бы избежать, если бы вы просто постарались оформить код в соответствии с этим маленьким соглашением о кодировании на Prolog — для начала, нужно дать именам переменных и функций осмысленные имена и записывать код не в одну строчку (я исправил форматирование). Даже пролог подсказывает вам, что переменным K1 и T1 не присвоено значение до того, как они будут использованы.

    Если вы хотите работать с файлом в Visual Prolog — сначала надо объявить тип файла в разделе domains:

    domains
      file = my_input_file; my_output_file

    После этого вы можете использовать имя file при описании предикатов (если им требуется работать с каким-либо файлом, переданным в качестве аргумента) и имена my_input_file/my_output_file для задания идентификатора файла с которым нужно работать (вместо f1 в вашем коде).

    После того, как я изменил форматирование кода, стало видно, почему интерпретатор ругается на переменные K1 и T1:

    file_read(K,T,Z):-
      not(eof(f1)), 
      /* ... */
      file_read(K1,T1,Z); 
      K1 > T1, Z=("Да"); 
      /* ... */

    Код, расположенный после точки с запятой получает управление только если вычисления блока кода до точки с запятой завершается неудачей. Т.е. в вашем случае сравнение K1 > T1 будет выполняться, например, если файл кончился (not(eof(f1)) вернул fail). Если вам не понятно почему программа работает именно так — читайте статью Принципы построения программ на Prolog.

  • #2933

    Посмотрите тему о работе с файлами в Turbo/Visual Prolog — там есть предикат для считывания с файла списка чисел. Список можно разделить его на список положительных и отрицательных элементов, а затем сравнить длины списков, полученные предикатом length:

    file_numbers_to_list(text_input_file, [], List),
    divide_positive_negative_zero(List, Positive, Negative, _Zero),
    length(Posilive, PositiveCount),
    length(Negative, NegativeCount),
    NegativeCount < PositiveCount.

  • #2935

    Ketrin
    Участник

    predicates
      file_read (integer,integer)
      
     p(integer,integer,symbol)
    clauses
    file_read(K,T):-
      eof(f1), 
      clozefile(f1),!.
    file_read(K,T):-
      eof(f1), 
      readint(X), 
      X > 0,
      K1=K+1,
      file_read(K1,T); 
      not(eof(f1)),
      T1=T+1, 
      file_read(K,T1).
       
     p(K1,T1,Z):-
       K1 > T1,Z="Да";
       Z="Нет".
     
    goal 
      openread(f1,"F:/2.txt"), 
      readdevice(f1),
      file_read(0,0),
      p(K,T,Z), 
      write(Z). 

    Посмотрите что теперь не так, вроде все прописано

    • #2936

      Я написал постом выше как решается ваша задача. Просто скопируйте предикаты по моим ссылкам в свою программу — все будет работать.
      Что вы исправили в своем коде? — имена переменных K, T, Z и предиката p лично мне ни о чем не говорят (даже не знаю чем их заменить), посмотрите как оформлен код в моих примерах и делайте также. Не сливайте код в одну строку.

      Напишите к своему коду пояснения, т.е. опишите как на ваш взгляд он должен работать. Я не понимаю, Prolog тоже не понимает и выдает ошибки:

      1. в функции file_read аргументы K и T не используются. Они там реально не используются и по именам я даже не могу предположить что вы хотели изобразить;
      2. Undeclared predicate, misspelling or not supported on chosen platform clozefile

        Догадываюсь, что вы хотели использовать closefile, но не понимаю, почему вы просто не запустите программу и не посмотрите ошибки, которые выдаст компилятор;

      3. после исправления предыдущей ошибки вы получите сообщения про то, что функтор f1 не определен, я специально для вас написал вчера статью про работу с файлами в Visual Prolog, прочитайте ее — там написано как объявить идентификаторы файлов;
      4. когда вы исправите ошибку с идентификаторами — получите сообщение

        Free variable in expression

        на этой строке: K1 > T1. В вашем коде вызывается функция p и ей передаются две переменные, значения которым не присвоены (K и T). Функция сразу пытается сравнивать эти переменные, но анонимные (без значения) переменные запрещено сравнивать — поэтому вываливается ошибка. Я бы рад был вам помочь, но я даже не догадываюсь что вы хотите тут сделать — логики вообще не видно.

      Если вам нужна помощь — нужно:

      1. описать как на ваш взгляд должна работать программа (алгоритм) и привести нормально оформленный код. Алгоритм можете выложить хоть в виде блок-схемы;
      2. прочитать статьи по ссылкам — видно, что вы сейчас не понимаете как работают программы на Prolog и как нужно работать с файлами;
      3. объяснить чем не подходит решение, которое я привел в предыдущем посте, т.к. мы пытаемся решить задачу, которая уже решена.

Для ответа в этой теме необходимо авторизоваться.