Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Другие языки > [Prolog]Вывод несколько результатов


Автор: Neox_GeForce 26.5.2012, 17:20
Есть такой код на Turbo Prolog 2.0 для вывода количества детей у семье(предикат query2).
Но выводиться только один результат, первый. Почему? И как решить эту проблему?
Код

domains    
     day,year,salary=integer
     f_name,s_name,month,job=string
     data=data(day,month,year)
     work=work(job,salary)
     member=member(f_name,s_name,data,work)
     childrens=member*
 
predicates  
      nondeterm family(member,member,childrens)
      nondeterm chname(childrens)
      nondeterm query1
      nondeterm query2
      nondeterm child_count(integer,childrens)
   
clauses  
     family(
         member("Misha","Alexandrov",data(20,"oktober",1962),work("enginer",1120)),
         member("Maria","Alexandrov",data(1,"april",1964),work("laborant",980)),
          [
          member("Alexandr","Alexandrov",data(10,"july",1986),work("student",200))
          ]
          ).
     family(
         member("Ivan","Petrov",data(12,"jan",1965),work("worker",950)),
         member("Galina","Petrova",data(5,"jan",1966),work("no",0)),
          [
          member("Nikolay","Petrov",data(16,"nov",1986),work("manager",850)),
          member("Sergey","Petrov",data(16,"nov",1986),work("manager",970)),
          member("Evgeniy","Petrov",data(14,"april",1990),work("student",150))
          ]
          ).        
     family(
         member("Sergey","Kaval",data(21,"August",1972),work("worker",750)),
         member("Raisa","Kaval",data(15,"september",1974),work("teacher",650)),
          [
          member("Yana","Kaval",data(4,"April",1996),work("no",0)),
          member("Ioan","Kaval",data(5,"April",1997),work("no",0)),
          member("Petro","Kaval",data(6,"April",1998),work("no",0))
          ]
          ).
    family(
         member("Sergey","Ivanov",data(21,"August",1972),work("worker",750)),
         member("Raisa","Ivanov",data(15,"september",1974),work("teacher",650)),
          [
          member("Yana","Ivanova",data(4,"April",1996),work("no",0)),
          member("Ioan","Ivanov",data(5,"April",1997),work("no",0)),
          member("Petro","Ivanov",data(6,"April",1998),work("no",0))
          ]
          ).
    family(
         member("Sergey","Kornij",data(21,"August",1972),work("worker",750)),
         member("Raisa","Kornij",data(15,"september",1974),work("teacher",650)),
          [
          member("Ioan","Kornij",data(5,"April",1997),work("no",0)),
          member("Petro","Kornij",data(6,"April",1998),work("no",0))
          ]
          ).
     
     chname([]).     
     chname([member(X,_,_,_)|T]):-write(X),nl,chname(T).
              
    child_count(0,[]).     
    child_count(Num,[_|T]):-child_count(Num1,T),Num=Num1+1.

     query1 :-    write("Input surname?"),nl,readln(Sname),
                family(member(W,Sname,_,_),member(Y,_,_,_),Children),
                writef("----START-[%s]-",Sname),nl,
                write(W),nl,write(Y),nl,chname(Children),
                write("------END--------"),nl.
                
     query2 :-    family(member(_,S_name,_,_),_,Children),
                child_count(Num,Children),
                writef("%s - has %d child \n",S_name,Num).  
     
goal query2.


Автор: Фантом 26.5.2012, 18:38
Потому что надо либо каким-то образом заставить систему переискать результат после обнаружения первого подходящего (см. "методы организации перебора в Прологе" и служебный предикат fail), либо явно потребовать найти все решения  (см.служебный предикат findall).

Автор: Neox_GeForce 26.5.2012, 20:38
Сделал с помощью fail
Код

goal query1,nl,query2,fail.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)