2016-12-18 2 views
0

Я хочу написать программу, которая возвращает изменения в Prolog, я пробовал этот предикат, но я не уверен в этом, потому что я хотел сделать то же самое, что и в программе на C/C++. Если у кого-то есть коррекция, я был бы признателен.Программа в Prolog, которая возвращает изменения

dollar(100). 
quarter(25). 
dime(1). 


return(0,0,0). 
return(Amount_recieved,Amount_due,Change) :- 
    Change is Amount_recieved - Amount_due. 

dollar(100) is Change/100 , Change is Change mod 100. 
quarter(25) is Change /25 , Change is Change mod 25. 
dime(1) is Change 
+0

Позвольте мне угадать: вы хотите, предикат, который, учитывая количество полученных и дали причитающуюся сумму , возвратить (унифицировать, выразить его в терминах Пролога) «Изменить», выраженное тройкой (доллары, кварталы и десять центов), максимизирующими сначала доллары и секунды квартала? Если да: 'Amount_received' и' Amount_due' выражены в десятину или в тройках (доллары, кварталы и десять центов)? – max66

+0

Да, я хочу, чтобы они были выражены в тройках –

ответ

1

я предложить следующее решение, основанное на структуры amount/3 с числом долларов (первое значение), четвертей (второе значение) и пятаков (третье значение)

getAmountInDimes(amount(Do, Qu, Di), AmountInDimes) :- 
    AmountInDimes is (Do * 100) + (Qu * 25) + Di. 

getAmountTriple(AmountInDimes, amount(Do, Qu, Di)) :- 
    Do is AmountInDimes div 100, 
    Mid is AmountInDimes mod 100, 
    Qu is Mid div 25, 
    Di is Mid mod 25. 

computeChange(AReceived, ADue, Change) :- 
    getAmountInDimes(AReceived, ARDimes), 
    getAmountInDimes(ADue, ADDimes), 
    ARDimes >= ADDimes, 
    CDimes is ARDimes - ADDimes, 
    getAmountTriple(CDimes, Change). 

Ниже приводится пример использования

computeChange(amount(20, 0, 0), amount(15, 2, 12), Ch) 

, что унифицировать Ch с amount(4,1,13).

Другой пример

computeChange(amount(20, 0, 0), amount(15, 2, 12), amount(Do, Qu, Di)) 

, которые непосредственно унифицировать Do с 4, Qu с 1 и Di с 13

+0

Я получил его сейчас ,,, Спасибо человеку :) –

+0

Возможно ли иметь такое же решение, но только с долларами, и я должен сообщить подробности об изменении, например: computeChange (сумма (20), сумма (8), ч) 1 вексель 10 $ 1 вексель 1 $ –

+0

@ Ilyes.B - 20 минус 8 - 12, так что, предположим, один счет 10 $ и * два * счета 1 $. Во всяком случае, да, я полагаю, это возможно, и я полагаю, вы можете понять, как изучать мой пример. Прежде всего, вы должны исправить стоимость денег (монет и векселей), которые вы хотите использовать. – max66

 Смежные вопросы

  • Нет связанных вопросов^_^