<div class="notebook"> <div class="nb-cell html" name="htm1"> <h2>Decision theory</h2> Using cplint you can also solve decision theory problems using the method proposed in [1]. Consider the following program: </div> <div class="nb-cell program" name="p1"> :- use_module(library(pita)). :- pita. :- begin_lpad. 0.3::rain. 0.5::wind. % decision facts ? :: umbrella. ? :: raincoat. broken_umbrella :- rain,umbrella,wind. dry :- rain, raincoat. dry :- rain, umbrella, \+(broken_umbrella). dry :- \+(rain). % utility facts utility(broken_umbrella,-40). utility(raincoat,-20). utility(umbrella,-2). utility(dry,60). :- end_lpad. </div> <div class="nb-cell markdown" name="md1"> It models a situation where a user is unsure whether bring an umbrella or wearing a raincoat. There are two decision facts indicated with `?::`. The utility of each probabilistic fact is indicated with the predicate `utility/2`. For instance, `utility(broken_umbrella,-40)` means that the utility of the probabilistic fact `broken_umbrella` is `-40`. The goal here is to find the subset of the decision variables that gives the highest expected utility. To solve the program, you can use the predicate `dt_solve/2` in this way: </div> <div class="nb-cell query" name="q1"> dt_solve(Decision,Utility). </div> <div class="nb-cell markdown" name="md4"> The expected solution is to bring the `umbrella` which has expected utility `43`. </div> <div class="nb-cell markdown" name="md2"> Another possibility is to extend the [viralmarketing problem](http://cplint.eu/example/inference/viral.swinb) with decision facts. Suppose you have a list possible costumers that are connected in a social network. You have to decide which one to market in order to get the highest possible revenue. For instance, the program could be: </div> <div class="nb-cell program" name="p2"> :- use_module(library(pita)). :- pita. :- begin_lpad. ? :: marketed(theo). ? :: marketed(bernd). ? :: marketed(guy). ? :: marketed(ingo). ? :: marketed(angelika). ? :: marketed(martijn). ? :: marketed(laura). ? :: marketed(kurt). utility(marketed(theo),-2). utility(marketed(bernd),-2). utility(marketed(guy),-2). utility(marketed(ingo),-2). utility(marketed(angelika),-2). utility(marketed(martijn),-2). utility(marketed(laura),-2). utility(marketed(kurt),-2). utility(buys(theo),5). utility(buys(bernd),5). utility(buys(guy),5). utility(buys(ingo),5). utility(buys(angelika),5). utility(buys(martijn),5). utility(buys(laura),5). utility(buys(kurt),5). 0.2 :: buy_from_marketing(_). 0.3 :: buy_from_trust(_,_). trusts(X,Y) :- trusts_directed(X,Y). trusts(X,Y) :- trusts_directed(Y,X). trusts_directed(bernd,ingo). trusts_directed(ingo,theo). trusts_directed(theo,angelika). trusts_directed(bernd,martijn). trusts_directed(ingo,martijn). trusts_directed(martijn,guy). trusts_directed(guy,theo). trusts_directed(guy,angelika). trusts_directed(laura,ingo). trusts_directed(laura,theo). trusts_directed(laura,guy). trusts_directed(laura,martijn). trusts_directed(kurt,bernd). buys(X):- marketed(X), buy_from_marketing(X). buys(X):- trusts(X,Y), buy_from_trust(X,Y), buys(Y). :- end_lpad. </div> <div class="nb-cell markdown" name="md3"> You can ask what is the best strategy using as before `dt_solve/2`: </div> <div class="nb-cell query" name="q2"> dt_solve(Decision,Utility). </div> <div class="nb-cell markdown" name="md5"> Here the expected solution is to market `theo`, `guy`, `ingo` and `martjin` which has expected utility `3.21`. </div> <div class="nb-cell html" name="htm2"> <h3>References</h3> [1] G. V. den Broeck, I. Thon, M. van Otterlo, L. D. Raedt, Dtproblog: A decision-theoretic probabilistic prolog, in: M. Fox, D. Poole (Eds.), 24th AAAI Conference on Artificial Intelligence, AAAI’10, Atlanta, Georgia, USA, July 11-15, 2010, AAAI Press, 2010, pp. 1217–1222. </div> </div>