Пролог

  • 4 ответов
    • mustitz
      mustitz
      Бронза
      На форуме с: 07.01.2008 Сообщения: 3.696
      Хоть бы условие привел, чтобы можно было поглядеть. А что за пролог?
    • Suicid1g
      Suicid1g
      Бронза
      На форуме с: 05.07.2009 Сообщения: 3.371
      Условие простое - решить задачу о ханойских башнях)
      Borland turbo prolog
    • Kogtistiy
      Kogtistiy
      Администратор
      Администратор
      На форуме с: 05.07.2008 Сообщения: 32.724
      Вещь сугубо специальная... Попробуй еще на более "профильные" форумы обратиться.
    • mustitz
      mustitz
      Бронза
      На форуме с: 07.01.2008 Сообщения: 3.696
      inet говорит, что так:http://progz.ru/forum/viewtopic.php?p=71683

      code:
      domains
      loc=right;middle;left
      il=integer*
      state=s(il,il,il)
      path=state*
      sl=string*
      predicates
      диски(integer,integer,il)
      ханой(integer,loc,loc,loc,il,path,sl)
      путь(integer,loc,loc,loc,path,path,sl,sl)
      переместить(loc,loc,state,state)
      реверс(path,path,path)
      реверс(sl,sl,sl)
      вывод(integer,path,sl)
      goal
      N=3,диски(N,1,Диски),ханой(N,left,middle,right,Диски,Путь,Ответ),вывод(0,Путь,Ответ),exit.
      clauses
      диски(N,N,[N]):- !.
      диски(N,C,[C|Диски]):- C1=C+1,диски(N,C1,Диски).
      
      ханой(N,A,B,C,Диски,Путь,Ответ):-
          путь(N,A,B,C,[s(Диски,[],[])],Путь1,["Исходное состояние: "],Строки),
          реверс(Путь1,[],Путь),реверс(Строки,[],Ответ).
      
      путь(0,_,_,_,Путь,Путь,Ответ,Ответ):- !.
      путь(N,A,B,C,Путь0,Путь,Стр0,Стр):-
          N1=N-1,
          путь(N1,A,C,B,Путь0,[Сост0|Путь1],Стр0,Стр1),
          переместить(A,C,Сост0,Сост1),
          term_str(loc,A,SA),term_str(loc,C,SC),
          format(Строка,"Перенести диск % с % на %",N,SA,SC),
          путь(N1,B,A,C,[Сост1,Сост0|Путь1],Путь,[Строка|Стр1],Стр).
          
      переместить(left,right,s([D|L],M,R),s(L,M,[D|R])):- !.
      переместить(left,middle,s([D|L],M,R),s(L,[D|M],R)):- !.
      переместить(middle,right,s(L,[D|M],R),s(L,M,[D|R])):- !.
      переместить(A,C,Сост1,Сост2):- переместить(C,A,Сост2,Сост1).
      
      реверс([A|L],S,R):- реверс(L,[A|S],R).
      реверс([],L,L).
      
      вывод(C,[s(L,M,R)|Сост],[Строка|Строки]):-
          write(C,". ",Строка,"n",L," - ",M," - ",R),nl,
          C1=C+1,вывод(C1,Сост,Строки).
      вывод(_,[],[]).