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

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




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

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

 
Да, именно.

 
Вот по совету 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
Подскажите плиз что я делаю не так??? Может не та версия пролога? Слышал что их много есть(например Турбо)?
Заранее спасибо!

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

 
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.
/*======================================================*/


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

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


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

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

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

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


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

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

 Re: Помогите плиз с задачей по логическому программированию
Искомый Вами предикат можно определить так («дно» допишите сами):
Код:
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