2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Помогите плиз с задачей по логическому программированию
Сообщение16.04.2009, 11:28 


16/04/09
9
Добрый день! необходимо решить след. задачу: С помощью логического программирования(пролог) создать программу размена рубля на монеты по 5,
10, 25, 50 коп. Как подобное сделать на C# знаю - путем создания вложенных циклов, а вот с прологом раньше не сталкивался.
Хелп плиз!!! Заранее спасибо!!!!

 Профиль  
                  
 
 
Сообщение16.04.2009, 12:42 
Заслуженный участник


18/03/07
1068
Вам нужно перечислить все варианты размена?
Погуглить по словам 'prolog coin change' не пробовали?

 Профиль  
                  
 
 
Сообщение16.04.2009, 13:11 


16/04/09
9
Да, именно.

 Профиль  
                  
 
 
Сообщение16.04.2009, 16:31 


16/04/09
9
Вот по совету luitzena нашел пример http://home.agh.edu.pl/~wojnicki/phd/node35.html:

Код:
coin(100). coin(25). coin(10).

change(S,[S]):- coin(S).
change(S,L):- S>0, coin(M),
S1 is S - M,
change(S1, L1),
L1=(H|_), H >= M,
L=(M|L1).

Делал так: сначала установил у себя Visual Prolog 5.2 , создал новый проект, в нем file->new, ввел туда код, затем Project -> Test Goal -> выдает след. ошибку:E;Test_Goal, pos: 1, 3 Illegal keyword
Подскажите плиз что я делаю не так??? Может не та версия пролога? Слышал что их много есть(например Турбо)?
Заранее спасибо!

 Профиль  
                  
 
 
Сообщение16.04.2009, 17:06 
Заслуженный участник


18/03/07
1068
Автор ресурса, скорее всего, использовал SWI-Prolog.

 Профиль  
                  
 
 
Сообщение16.04.2009, 17:37 


16/04/09
9
SWI-Prolog скачал и установил - создал новый файл, впихнул туда код :)
Но что-то не могу найти там запуск!?

Добавлено спустя 16 минут 4 секунды:

Вот еще пример нашел, но блин тут черт ногу сломает, что и как запустить..


Код:
/* SYNOPSIS: Find all subsets of coins totalling to amount.
* - Mohsin Ahmed (mosh@cse.iitb.ernet.in) 1-10-93.
* GPL(C) Mohsin Ahmed, http://www.cs.albany.edu/~mosh                   
*/

/*
* @ch_all( Amount:in, CoinList:in )
* TopCallEg: ch_all( 100, [50,25] )
* Gives all subsets of coins that add upto amount.
*/

ch(M,[M|_],M).
ch(A,[_|R],L) :- ch(A,R,L).
ch(A,[C|R],C+L) :-
   A >= C, A1 is A - C,
   ch(A1,[C|R],L).
ch_all( M, L ):-
   ch( M, L, A ), write( A ), nl, fail.
/*=== Partition integer N into smaller integers.
TopCallEg: part( 10 ).
@part( N:integer:in )
   gives all subsets of integers that add to N.
   Uses ch_all from above.
*/
part( N ) :- part( N, [1] ).
part( N, [N|L] ):-
   ch_all( N, [N|L] ).
part( N, [X|Y] ):-
   X < N, Z is X+1, part( N, [Z,X|Y] ).
/*=== Count all Solutions to coin change problem.
TopCallEg: cc_all( 100, [50,25] ).
@cc( Case:in, Amount:in, CoinList:in, NumberOfSolutions:out )
@dd(          Amount:in, CoinList:in, NumberOfSolutions:out )
*/
cc(c,A,[C1|R],S, NS) :-
   A >= C1, A1 is A - C1,
   dd(A1,[C1|R],S+C1, NS).
cc(b,A,[_|R],S,NS) :-
   dd(A,R,S,NS).
cc(None,_,_,_,0).
dd( 0, _, S, 1  ):- write( S ), nl.
dd( A, L, S, NS ):-
   cc(a,A,L, S, NS1),
   cc(b,A,L, S, NS2),
   cc(c,A,L, S, NS3),
   NS is NS1 + NS2 + NS3.
cc_all( A, L ):-
   dd( A, L, 0, NS ),
   write('Num of Sols: '), write( NS ), nl.
/*======================================================*/


Зада упрощается, код вроде как есть, осталось только понять как и в каком прологе и в какой версии его надо откомпилить...

 Профиль  
                  
 
 
Сообщение16.04.2009, 17:39 
Заслуженный участник


18/03/07
1068
City писал(а):
SWI-Prolog скачал и установил - создал новый файл, впихнул туда код :)
Но что-то не могу найти там запуск!?


Вы, кажется, описали задачу, но не дали команды её решать :).

Если я правильно помню, файл с описанием задачи удобно импортировать с помощью предиката use_module/1. Как там в вашем IDE, я не знаю.

И это… создаётся впечатление, что Вы не знакомы с Прологом и хотите просто получить готовый код :).

 Профиль  
                  
 
 
Сообщение16.04.2009, 18:04 


16/04/09
9
Всё, разобрался, работает последний код через SWI-Prolog.
Вобщем если кому еще понадобиться, действия:
1. Устанавливаем SWI-Prolog
2. Запускаем его, создаем в нем новый файл - туда вышеуказанный код
3. В окне SWI выбираем file-consult-наш файл - таким образом указываем что будем делать запросы к необходимому файлу
4. Делаем запрос вида: cc_all( 100, [5,10,25,50] ). - что означает показать все варианты вхождения в 100 монет по 5, 10, 25, 50.
5. Всё :)

P.S>Если я что-то неправильно написал просьба меня поправить..

Добавлено спустя 1 минуту 37 секунд:

luitzen
- отдельное спасибо. В который раз убеждаюсь что надо учить английский - насколько всё-таки больше ресурсов на нём...

 Профиль  
                  
 
 Re: Помогите плиз с задачей по логическому программированию
Сообщение16.05.2009, 01:03 


16/05/09
1
Помогите ещё с одной пожалуйста ...


Определить предикат, который является истинный, если в списке каждый следующий элемент на единицу больше предыдущего

должно получится типа того L=[1,2,3,4] yes
L=[a,1,b] no
L=[1,7,5] no

 Профиль  
                  
 
 Re: Помогите плиз с задачей по логическому программированию
Сообщение16.05.2009, 14:59 
Заслуженный участник


18/03/07
1068
Искомый Вами предикат можно определить так («дно» допишите сами):
Код:
incr([A|[B|C]]):- succ(A,B), incr([B|C]).

Здесь succ/2 — некий встроенный предикат из SWI-Prolog :).
Вас будет устраивать сообщение об ошибке вместо “No” для incr([a,1,b]). ?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group