Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Как правильно реализовать счетчик?
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
ekekek ekekek вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2017
Smile Как правильно реализовать счетчик? - 10.10.2017, 22:11

Проблема вот в чем. Нужен счетчик, который бы считал количество введенных "да", когда спрашиваем :
write("Вы знаете ",Lang," язык?\n")and
readln(Answer) and
Answer="да" and

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

Помогите, пожалуйста

prolog Код:
database
    language(symbol)
    know(symbol,symbol)
 single count(integer)
predicates
    nondeterm choice(integer)
    menu
    nondeterm repeat

clauses
    language("английский").
    language("китайский").
    language("французский").
    count(0).
   
% Добавить человека в базу
    choice('1'):-  
    write("Введите ваше имя:\n") and
    readln(Name) and
    language(Lang) and
    write("Вы знаете ",Lang," язык?\n")and
    readln(Answer) and
    Answer="да" and
    count(T) and
    J=T+1 and
    assert(count(J)) and
    assert(know(Name,Lang)) and
    fail.
   
% Добавить язык в базу
    choice('2'):-
    write("Какой новый язык вы бы хотели выучить?\n") and
    readln(Line) and
    assert(language(Line)).
   
% Вывести всех людей в базе
    choice('3'):-
    write("Список людей, находящихся в базе:\n") and
    know(Name,Lang) and
    write(Name," знает ",Lang, " язык.") and
    nl.
   
%Вывести все языки в базе
    choice('4'):-
    write("Список языков, находящихся в базе:\n") and
    language(Lang) and
    write(Lang) and
    nl.
   
%Вывести сколько языков знают все люди в базе в сумме
    choice('5'):-
    write("Сколько языков знают все люди в базе в сумме:\n") and
    count(J) and
    write("Люди в базе знают ", J, " языка.") and
    nl.
   
   
% Записать базу данных в файл
    choice('з'):-      
    write("Введите имя файла:\n") and
    readln(Name) and
    save(Name) and
    write("Успешно записано!\n").
   
% Читать базу данных из файла
    choice('ч'):-      
    write("Введите имя файла:\n"),
    readln(Name),
    existfile(Name),!,
    consult(Name),
    write("Успешно считано!\n");
    write("файл не найден\n").


% Выход
    choice('0') :-
    !.

    menu :-
    repeat,    
    write("--------------------------------------------\n"),
    write("Выберите:\n"),
    write("1 - Добавить человека\n"),
    write("2 - Добавить язык\n"),
    write("3 - Показать всех людей\n"),
    write("4 - Показать все языки\n"),
    write("5 - Сколько языков знают все люди в базе в сумме\n"),
    write(- Записать базу данных в файл\n"),
    write(- Читать базу данных из файла\n"),
    write("0 - Выход\n"),
    readchar(Choice),
    choice(Choice),
    Choice='0',
    !.
    repeat.
    repeat :- repeat.   /*Продолжение работы*/
goal
    menu.
Ответить с цитированием
  (#2 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,236
Сказал(а) спасибо: 25
Поблагодарили 51 раз(а) в 51 сообщениях
Регистрация: 16.10.2005
По умолчанию 10.10.2017, 23:04

Ну примерно так
Visual Prolog Код:
database
  count(string, integer)
predicates
  increment(string)
clauses
  increment(Name) :-
    retract(count(Name, Count)),
    !,
    NewCount = Count + 1,
    assert(count(Name, NewCount));

    assert(count(Name, 1));

Последний раз редактировалось Alexiski; 11.10.2017 в 02:38 Причина: Исправил ошибку в коде
Ответить с цитированием
  (#3 (permalink)) Старый
ekekek ekekek вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2017
По умолчанию 10.10.2017, 23:38

Цитата:
Сообщение от Alexiski Посмотреть сообщение
Ну примерно так
Visual Prolog Код:
database
  count(string, integer)
predicates
  increment(string)
clauses
  increment(Name) :-
    retract(count(Name, Count)),
    !,
    NewCount = Count + 1,
    assert(count(Name, Count));

    assert(count(Name, 1));
а где используется переменная NewCount?
Ответить с цитированием
  (#4 (permalink)) Старый
ekekek ekekek вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2017
По умолчанию 11.10.2017, 00:32

и если можно, объясните поподробнее
Ответить с цитированием
  (#5 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,862
Сказал(а) спасибо: 2
Поблагодарили 287 раз(а) в 287 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 11.10.2017, 00:52

1. Надо для каждого человека использовать факт с его именем, хранящий кол-во языков:
Visual Prolog Код:
countPerson(symbol, integer)
2. Надо изменить код:
Visual Prolog Код:
choice('1'):-  
    write("Введите ваше имя:\n") and
    readln(Name) and
        assert(countPerson(Name,0)) and
    language(Lang) and
    write("Вы знаете ",Lang," язык?\n")and
    readln(Answer) and
    Answer="да" and
        countPerson(Name,T) and
    J=T+1 and
        retract(countPerson(Name,T)) and
        assert(countPerson(Name,J)) and
    assert(know(Name,Lang)) and
    fail.
Изменения я выделил отступом.
Однако можно узнать кол-во языков без счётчика - надо просто с помощью findall собрать все языки человека в список и найти его длину.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,236
Сказал(а) спасибо: 25
Поблагодарили 51 раз(а) в 51 сообщениях
Регистрация: 16.10.2005
По умолчанию 11.10.2017, 02:39

Цитата:
Сообщение от ekekek Посмотреть сообщение
а где используется переменная NewCount?
Ошибся, исправил прямо там
Ответить с цитированием
  (#7 (permalink)) Старый
ekekek ekekek вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2017
По умолчанию 11.10.2017, 09:41

тут мы получается задаем изначально количество равное 0?
Visual Prolog Код:
assert(countPerson(Name,0)) and
а тут, удаляем из базы как бы старое значение ? а потом добавляем с новым увеличенным на 1? немного не пойму зачем вот из базы удалять
Visual Prolog Код:
countPerson(Name,T) and
    J=T+1 and
        retract(countPerson(Name,T)) and
        assert(countPerson(Name,J)) and
Ответить с цитированием
  (#8 (permalink)) Старый
ekekek ekekek вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2017
По умолчанию 11.10.2017, 09:42

Спасибо, что помогли Работает все как нужно, только с пониманием у меня тяжело((
Ответить с цитированием
  (#9 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,862
Сказал(а) спасибо: 2
Поблагодарили 287 раз(а) в 287 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 11.10.2017, 20:17

Цитата:
Сообщение от ekekek Посмотреть сообщение
тут мы получается задаем изначально количество равное 0?
Да.
Цитата:
Сообщение от ekekek Посмотреть сообщение
а тут, удаляем из базы как бы старое значение ? а потом добавляем с новым увеличенным на 1? немного не пойму зачем вот из базы удалять
Да, добавляем новое вместо старого значения. Сейчас счётчик у нас не single, а nondeterm. Благодаря удалению старого значения счётчик хранит только одно, самое свежее значение.

Последний раз редактировалось Винитарх; 11.10.2017 в 20:20
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
счетчик pfc-cska-fanat Prolog 8 21.12.2011 21:04
Как правильно добавить счетчик Серега81 С/С++ 0 02.06.2011 09:12
счетчик hripun Вопросы начинающих программистов 3 09.05.2011 12:37
Составление алгоритма как правильно реализовать EugeneBrikov Алгоритмы 1 26.04.2011 10:21
Seaside - как правильно реализовать навигацию Life_Freedom_Love Smalltalk 2 16.01.2011 21:39
счетчик b1nary Prolog 2 25.09.2010 14:37
Работа с Graphics32 как правильно реализовать Docik C++ Builder 1 14.03.2008 00:40
Как правильно реализовать библиотеку для работы с временем BabyBear С/С++ 21 25.01.2006 03:29
Как создать счетчик st. WinAPI 5 13.10.2005 12:45
Счетчик для принтера Rato C++ Builder 3 25.07.2005 19:10
Как правильно реализовать передачу строк Aglob С/С++ 2 01.06.2005 19:10
Счетчик sCandal PHP 6 03.07.2004 16:40



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов