2014 dxdy logo

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

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




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

 
 
 
 
Сообщение16.04.2009, 12:42 
Вам нужно перечислить все варианты размена?
Погуглить по словам 'prolog coin change' не пробовали?

 
 
 
 
Сообщение16.04.2009, 13:11 
Да, именно.

 
 
 
 
Сообщение16.04.2009, 16:31 
Вот по совету 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 
Автор ресурса, скорее всего, использовал SWI-Prolog.

 
 
 
 
Сообщение16.04.2009, 17:37 
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 
City писал(а):
SWI-Prolog скачал и установил - создал новый файл, впихнул туда код :)
Но что-то не могу найти там запуск!?


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

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

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

 
 
 
 
Сообщение16.04.2009, 18:04 
Всё, разобрался, работает последний код через 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 
Помогите ещё с одной пожалуйста ...


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

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

 
 
 
 Re: Помогите плиз с задачей по логическому программированию
Сообщение16.05.2009, 14:59 
Искомый Вами предикат можно определить так («дно» допишите сами):
Код:
incr([A|[B|C]]):- succ(A,B), incr([B|C]).

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

 
 
 [ Сообщений: 10 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group