Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Рекурсия и вывод на печать
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Foxa Foxa вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.09.2005
По умолчанию Рекурсия и вывод на печать - 29.09.2005, 00:20

Уж сколько ругали и ругают Turbo Prolog 2.0, а таки на нем студенты учатся.


Было условие в лабораторной: "Написать программу в которой есть некоторый
перечень животных и скоростей, которые они могут развивать. При введении
скорости программа должна выводить список всех животных, которые могут
развивать такую скорость(т.е. Скорость_животного >= Введенная_скорость).
Программа должна завершать віполнение при введении определенной комбинации
клавиш".

Біл написан следущий код:
Код:
domains
  name=string
  speed=integer
predicates
  animal(string,integer)
  enter(integer)
  repeat
  chek(integer)
  find(integer)
  clear
  now
clauses
  animal(zebra,5).
  animal(panda,7).
  animal(leopard,8).
  animal(olen,5).
  animal(slon,3).
  repeat.  
  repeat:-repeat.
  clear:-write("for exit enter: -1"),nl,  now,nl.
  now:-  write("input the speed:"),nl.
  enter(C):- repeat,readint(C),nl,chek(C),nl.
  chek(-1):- write("........exit"),!.
  chek(C):- find(C),fail. 
  chek(C):- not(find(C)),write("Nema!").
  find(C):- animal(Name,Speed),C<=Speed,write(Name),nl,nl,nl.
goal
    makewindow(1,2,3,"  ",0,0,25,80),
    clear,enter(C) .
И все бы было замечательно, но первую выборку программка дублирует в конце.
Например, введем в качестве скорости 5, вывод:

zebra
panda
leopard
olen
zebra

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

Вот в этой строчке происходит дублирование зебры:
Код:
chek(C):- not(find(C)),write("Nema!").
Виноват предикат: find©.
Причина в том, что Вы вывод сделали практически на дне рекурсии, а его надо бы вынести повыше. Т.е. write(Name) надо перенести хотя бы в предикат chek().
А вообще-то Вы очень мудрёно сделали такую простую задачку. Её можно оформить намного проще.
Ответить с цитированием
  (#3 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 30.09.2005, 18:12

Немного проще у меня вышло так:
Код:
predicates
nondeterm animal(symbol,integer)
nondeterm enter
nondeterm repeat
check(integer)
nondeterm find(integer,symbol)
clauses
animal(zebra,5).
animal(panda,7).
animal(leopard,8).
animal(olen,5).
animal(slon,3).

repeat. 
repeat:- repeat.

enter:- write("for exit enter: -1"),nl,
    repeat,
    nl,write("input the speed: "),
    readint(C),
    check(C).

check(-1):- !,nl,write("........exit"),nl.
check(C):- not(find(C,_)),!,nl,write("Nema!"),nl,fail.
check(C):- nl,find(C,Name),write(Name),nl,fail.

find(C,Name):- animal(Name,Speed),C<=Speed.
goal
%makewindow(1,2,3,"  ",0,0,25,80),
enter.
Ответить с цитированием
  (#4 (permalink)) Старый
Foxa Foxa вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.09.2005
По умолчанию Выражается всем благодарность! - 10.10.2005, 12:39

К огромнейшему моему умилению волнующая мою нежную душу задачка решена, посему благодарствую всем, кто учавствовал в этом деле! Еще раз СПАСИБО
Ответить с цитированием
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Print вывод на печать две страницы Aram .NET 0 06.12.2008 00:51
Вывод таблицы на печать в Worde bango Вопросы начинающих программистов 4 23.11.2008 22:33
Вывод на печать денежных сумм 0mega Вопросы начинающих программистов 3 13.10.2008 11:26
Вывод на печать графики. Arona Visual Basic 0 17.03.2007 01:36
Вывод Текста на печать Morgoth Программирование графики 2 05.03.2007 20:41
StringGrid вывод на печать документа Alex_strannik Delphi 2 03.01.2006 10:52
Рекурсия вывод на экран чисел keeply Pascal 1 05.12.2005 10:51
Вывод на печать Image из Фоторобота А C++ Builder 1 28.11.2005 01:18
Вывод на печать Bitmap Print Dimitri Visual C++ 1 31.10.2005 17:35
Вывод на печать документа Konic Pascal 3 16.10.2005 00:01
Вывод на печать документов из С++ qnxoid C++ Builder 4 08.10.2005 22:15
Вывод на печать документа в С++ 5lim Visual C++ 7 17.02.2005 17:46



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