%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Author: Enrico Oliva enrico.oliva@unibo.it %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % RULES AND FACTS TO SOPPORT THE CONTRARY %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % start([argA,argB,music,result,company,companyA,companyB,kindofmusicA,kindofmusicB,kindofmusic,dayA,dayB,day]). kindofmusic(rock). kindofmusic(folk). kindofmusic(jazz). contrary(result(1),result(-1)). contrary(result(-1),result(1)). contrary(play(1),play(-1)):-!. contrary(play(-1),play(1)):-!. contrary(music(X),music(Y)):- kindofmusic(Y), X\==Y. contrary(company(near),company(faraway)):-!. contrary(company(faraway),company(near)):-!. contrary(P,non(P)). contrary(non(P),P). %contrary(music(rock),non(music(rock))). %contrary(non(music(rock)),music(rock)). %contrary(willgo(susan),non(willgo(susan))). %contrary(non(willgo(susan)),willgo(susan)). overzero(X):-X>0. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % ARGUMENT SET TO NEGOTIATION WORKER COMPANY %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %contrary(salary(X),salary(Y)):- X\==Y. argument(argWsalary,1,facts([company(near)]),rules(_),conclusion([salary(1000)])). argument(argWprevious,1,facts([previousalary(1000)]),rules(_),conclusion([salary(1000)])). argument(argWfaraway,1,facts([myhome(roma)]),rules(_),conclusion([company(faraway)])). argument(argCall,1,facts([allemployee(1000)]),rules(_),conclusion([salary(1000)])). argument(argCrefound,1,facts([company(faraway)]),rules(_),conclusion([refound(yes)])). %start([argWsalary,argWprevious,argWfaraway,argCall,argCrefound]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % ARGUMENT SET TO PLAY MINORITY GAME %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% argument(argA,1,facts([result(1)]), rules([my_clause(play(X),[result(X)])]), conclusion([play(1)])). %argument enable to play some thing the last result (1) argument(argB,1,facts([result(-1)]), rules([my_clause(play(X),[result(X)])]), conclusion([play(-1)])). %argument enable to play some thing the last result (-1) argument(argC,1,facts([result(1),contrary(1,-1)]), rules([my_clause(play(X),[result(Y),contrary(Y,X)])]), conclusion([play(1)])). %argument enable to play OPPOSITE the last result (-1) argument(argD,1,facts([result(-1),contrary(-1,1)]), rules([my_clause(play(X),[result(Y),contrary(Y,X)])]), conclusion([play(-1)])). %argument enable to play OPPOSITE the last result (1) argument(kindofmusicA,1,facts([music(rock)]),rules(_),conclusion([play(1)])). argument(kindofmusicB,1,facts([non(music(rock))]),rules(_),conclusion([play(-1)])). argument(companyA,2,facts([willgo(susan)]),rules(_),conclusion([play(1)])). % argument(companyB,2,facts([non(willgo(susan))]),rules(_),conclusion([play(-1)])). argument(dayA,1,facts([today(sunday)]),rules(_),conclusion([play(-1)])). %because on monday I work argument(dayB,1,facts([non(today(sunday))]),rules(_),conclusion([play(-1)])). argument(comment,1,facts([busyday(sunday)],rules(_),conclusion([play(-1)]))). argument(mean,1,facts([mean(overzero),play(overzero,1)]),rules([myclause(play(X),[play(overzero,X)])]),conclusion([play(1)])). argument(mean,1,facts([mean(underzero),play(underzero,-1)]),rules([myclause(play(X),[play(overzero,X)])]),conclusion([play(-1)])). %I DON'T KNOW WHEN IS EQUAL ZERO argument(mean,1,facts([mean(equalzero),play(equalzero,X)]),rules([myclause(play(X),[play(equalzero,X)])]),conclusion([play(-1),play(1)])). % if the result is an argument come from the TUPLE CENTER!!!!!!!!!!! it's a COORDINATION ARGUMENT - A TUPLE ARGUMENT COORDINATOR! argument(result,1,facts([result(1)]),rules([my_clause(result(X))]),conclusion([result(1)])). %this argument RESULT read from tuple centre argument(mean,1,facts([mean(0,5)]),rules(_),conclusion([mean(0,5)])). argument(mean,1,facts([past([1,-1,1])]),rules(_),conclusion([past([1,-1,1])])). argument(music,1,facts([imtired(yes)]),rules(_),conclusion([non(music(rock))])). argument(kindofmusic,1,facts([music(rock)]),rules(_),conclusion([music(rock)])). argument(company,1,facts([willgo(susan)]),rules(_),conclusion([willgo(susan)])). % argument(day,1,facts([today(sunday)]),rules(_),conclusion([today(sunday)])). %because on monday I work %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % UTILY %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% lt(X,Y):-var(X);var(Y). lt(X,Y):-nonvar(X),nonvar(Y),X a [b,c,d] selection(X,[X|Rest],Rest). selection(X,[Head|List],Rest) :- selection(X,List,Rest). %selection(end,_,[]). selectionend(X,[X|Rest],Rest). selectionend(X,[Head|List],Rest) :- !,selectionend(X,List,Rest). selectionend(end,_,[]). permutation([],[]). permutation(List,[X|Perm]) :- select(X,List,Rest), permutation(Rest,Perm). % select(X,List,Rest) % X is an element of List and Rest contains the rest of the list. select(X,[X|Rest],Rest). select(X,[Head|List],[Head|Rest]) :- select(X,List,Rest). subset([A|X],Y) :- member(A,Y),subset(X,Y). subset([],Y). % The empty set is a subset of every set. %notsubset(+List,+ListList) notsubsetset(R,[H|T]):- not(subset(R,H)), notsubsetset(R,T). notsubsetset(_,[]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % PROCEDURE TO CALCULATE THE ACCETTABLE % RULES AFTER NEW RESULT ARGUMENT %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %first step enable rule to work!!! get the argument from the tuple center and define the valid subset of rules %all vs result!!! findsubsetvalidrules(ListArguments,R):- argument(result,_,facts(F),rules(R),conclusion(C)), findsubset(ListArguments,F,C,[],Return). findsubset(Arguments,Facts,Conclusions,ConflictFreeSet,Return):- selection(Name,Arguments,RestArguments), argument(Name,_,facts(F),rules(R),conclusion(C)), not(control(Conclusions,F)),!, add2end(Name,ConflictFreeSet,NewConflictFreeSet), findsubset(RestArguments,Facts,Conclusions,NewConflictFreeSet,NewConflictFreeSet). findsubset(A,_,_,_,C):-write('Conflict free set'),write(C),nl,!,fail. % if P then Q else R %S :- P, !, Q. %S :- R. mem([]). turn(ArgumentSet):- selection(Name,ArgumentSet,RestArgumentSet), argument(Name,_,facts(F),rules(R),conclusion(C)), newconflictfree(RestArgumentSet,Result,F,C,[Name]). newconflictfree(Arguments,Result,Facts,Conclusions,ConflictFree):- selection(Name,Arguments,RestArguments), argument(Name,_,facts(F),rules(R),conclusion(C)), check(Facts,F,Conclusions,C), append1(Facts,F,NewFacts), append1(Conclusions,C,NewConclusions), add2end(Name,ConflictFree,NewConflictFree), newconflictfree(RestArguments,NewConflictFree,NewFacts,NewConclusions,NewConflictFree). check(FL,F,CL,C):- not(control(FL,C)), not(control(F,CL)), not(control(CL,C)). newconflictfree(_,[],_,_,_):-!,fail. newconflictfree(_,R,_,_,_):- mem(P), notsubsetset(R,P), retract(mem(P)), assert(mem([R|P])),!, mem(P1), %write(P1),nl, fail. %mem([[result,companyB,kindofmusicB,kindofmusic,dayA,day],[result,companyB,kindofmusicB,kindofmusic,dayA,dayB],[result,company,kindofmusicB,kindofmusic,dayA,day],[result,company,kindofmusicB,kindofmusic,dayA,dayB],[argB,companyB,kindofmusicB,kindofmusic,dayA,day],[argB,companyB,kindofmusicB,kindofmusic,dayA,dayB],[argB,company,kindofmusicB,kindofmusic,dayA,day],[argB,company,kindofmusicB,kindofmusic,dayA,dayB],[argA,result,company,companyA,kindofmusic,day],[argA,result,company,companyA,kindofmusicA,day]]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % SELECTION BY A CONDITION !!!!!!!!!!!!!!!!!!! % FIND ONLY THE CONCLUSION TO PLAY !!!!!!!!!!!!! % select(+ListArgument, -ListResult). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% select1([],[]). select1([H|T],Sel):- argument(H,_,facts(_),rules(_),conclusion(C)), (call(checkplay(C)) -> Sel=[H|R] ; Sel=R), select1(T,R). checkplay(C):-member(play(_),C). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % FILTER SETS ... FIND A PREFFERED EXTENSION %Look only undercut relation from outside to inside %fix the undercut outside and look for a defender %if don't find a defender eliminate from the set the udercat argument %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% removelist([],L,L). removelist([H|T],List1,Result):- %write(H),nl, delete(H,List1,R), %write(R),nl, removelist(T,R,Result). eliminatesubset([],CF,L,_,L). eliminatesubset([H|T],CF,Newset,Sol,R):- %write(Newset),nl, delete(H,CF,NewS), %write(NewS),nl, (notsubsetset(H,NewS)->Sol=[H|Newset];Sol=Newset), %write(T),nl, eliminatesubset(T,CF,Sol,Result,R). start(TotalArg):- not(turn(TotalArg)), mem(ConflictFreeSet),nl, write('conflic free set'),write(ConflictFreeSet),nl, prefered(TotalArg,ConflictFreeSet,PreferedSet), write('Admissible set'),write(PreferedSet),nl, eliminatesubset(PreferedSet,PreferedSet,[],_,Preferedmaxset), write('prefered set'),write(Preferedmaxset). prefered(_,[],[]). prefered(TotalArguments,[ConflictFreeSet|Rest],Solution):- findundercat(TotalArguments,ConflictFreeSet,Attacker,Defeat), %to find set of attacker to conflict free findundercat(ConflictFreeSet,Attacker,AttackerFromCF,DefeatOut), %it find the defend argument that block the attack removelist(DefeatOut,Attacker,AttackerNotDefeat), findundercat(AttackerNotDefeat,Defeat,AF,DF), removelist(DF,ConflictFreeSet,Sol), Solution=[Sol|Result], prefered(TotalArguments,Rest,Result). %write(AF),write(DF),nl. %eliminate from Attacker the DefeatOut but it need eliminate in the same position the element in the Defeat set %and eliminate from the conseguent subset the undercut argument %fix an arguments and look for all other arguments undercat from its %when it find an udercut argument check it's in the coflict free set %store the attacker argument and the defeat argument findundercat([],_,[],[]):-!. findundercat([H|T],CF,A,D):- argument(H,_,facts(F),rules(R),conclusion([C])), contrary(C,P),!, (argument(Element,_,facts([P]),rules(_),conclusion(_))-> (member(Element,CF)->(A=[H|R1],D=[Element|R2]);(A=R1,D=R2));(A=R1,D=R2)), findundercat(T,CF,R1,R2). %prefered([argA,argB,result,company,companyA,companyB,kindofmusicA,kindofmusicB,kindofmusic,dayA,dayB,day],[[argA,result,company,companyA,kindofmusicA,day]],P,Q). %filter([argA,argB,result,company,companyA,companyB,kindofmusicA,kindofmusicB,kindofmusic,dayA,dayB,day],[argA,result,company,companyA,kindofmusicA,day] check_argument(Name):-argument(Name,_,facts(F),rules(R),conclusion(C)), write('facts:'),write(F),nl, write('rules:'),write(R),nl, list(F), assert_list(F), rule(R,RB), list(RB), assert_list(RB), check_conclusion(C). assert_list([]). assert_list([T|C]):- write('assert'),write(T),nl, assert(T), assert_list(C). retract_list([]). retract_list([T|C]):- retract(T), retract_list(C). check_conclusion([non(T)|C]):-write('dimostro non'),write(T),nl,not(prove(T)). check_conclusion([H|T]):-write('dimostro '),write(H),nl,prove(H). % The basic Prolog meta-interpreter prove([]):-!. prove([Goal1|Goal2]) :- !, prove(Goal1), prove(Goal2). prove(Goal) :- write('call:'),write(Goal),nl, (my_clause(Goal, Body);call(Goal)),!, % prove(Body). % Arg1 undercuts Arg2 if F1 are contrast with C2 undercuts(Arg1,Arg2):- argument(Arg1,_,facts(F1),_,_), argument(Arg2,_,facts(F2),_,conclusion(C2)), control(F1,C2), write(undercut(Arg1,Arg2)),nl. rebuttal(Arg1,Arg2):- argument(Arg1,_,facts(F1),_,conclusion(C1)), argument(Arg2,_,facts(F2),_,conclusion(C2)), control(C1,C2), write(rebuttal(Arg1,Arg2)),nl, write(rebuttal(Arg2,Arg1)),nl. control([],_):-fail,!. control([T|C],C2):- %write('ctr1:'),write(T),write(C2),nl, contrary(T,CT), %write('ctr2:'),write(T),write(CT),nl, (member(CT,C2)->true; %(write(C),nl, (control(C,C2))). %member(not(T),C2) is a crucial point...!!! %check_acceptability(argument(Arg1,_,facts(F1),rules(R1),conclusion(C1)),Set_acceptance):- % argument(Arg2,_,facts(F2),rules(R2),conclusion(C2)), %Arg2 è una variabile libera - lascio aperto un choice point %HYPOTHESIS OVER TO WOKR...!!!