Я пишу многоагентную систему в 2APL. В моем файле агента у меня есть следующий вызов в функции правил ПК:
B(zoekBod(Location,Destination,Amount,PriceCorrection,PrevOrders,Price));
В файле убеждений я определил эту функцию пролога следующим образом:
zoekBod(Afz, Best, Aant, PC, [], Bod) :-
Max is abs(Best-Afz)*Aant*PC,
random( 1, Max, Bod ).
zoekBod(Afz, Best, Aant, PC, [opdracht(_,Aantal,Afzender,Bestemming,Prijs)|_], Bod) :-
OudeMaat=abs(Bestemming-Afzender)*Aantal,
Maat=abs(Best-Afz)*Aant,
0.75=<(Maat/OudeMaat),
(Maat/OudeMaat)=<1.33,
Bod=PC*Prijs.
zoekBod(Afz, Best, Aant, PC, [opdracht(_,Aantal,Afzender,Bestemming,_)|R], Bod) :-
OudeMaat=abs(Bestemming-Afzender)*Aantal,
Maat=abs(Best-Afz)*Aant,
(0.75>(Maat/OudeMaat); (Maat/OudeMaat)>1.33),
zoekBod(Afz, Best, Aant, PC, [R], Bod).
Это на голландском языке, но по сути цель состоит в том, чтобы на основе любых предыдущих заказов он вычислял цену для нового заказа. Когда это убеждение проверяется в 2APL, оно выдает мне ошибку:
[STEP: Execute all plans]
Failed to execute:
B(zoekBod(1, 3, 15, 1, [], Prijs))
Если я проверю его в gprolog с включенной трассировкой, я получу такой результат:
| ?- zoekBod(1,3,15,1,[],Prijs).
1 1 Call: zoekBod(1,3,15,1,[],_17) ?
2 2 Call: _101 is abs(3-1)*15*1 ?
2 2 Exit: 30 is abs(3-1)*15*1 ?
3 2 Call: random(1,30,_17) ?
3 2 Exit: random(1,30,25) ?
1 1 Exit: zoekBod(1,3,15,1,[],25) ?
Prijs = 25 ?
(2 ms) yes
{trace}
| ?-
Что именно так, как и предполагалось. Мой соответствующий раздел мас выглядит следующим образом:
<agent name="v1" file="vervoerder_voorbeeld.2apl">
<beliefs file="vervoerderext_voorbeeld.pl" shadow="true"/>
</agent>
Я полностью озадачен, почему это не удается выполнить. Может ли кто-нибудь помочь мне немного здесь? Заранее спасибо!
Извините, нашел ответ:
zoekBod(Afz, Best, Aant, PC, [], Bod) :-
Max is abs(Best-Afz)*Aant*PC,
random( 1, Max, Bod ).
должно быть:
zoekBod(Afz, Best, Aant, PC, [], Bod) :-
Max is abs(Best-Afz)*Aant*PC,
Bod is int(random(Max)+0.5).