From a3b6186a07ec266dd1283efd06062d23aede24d4 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Tue, 6 Nov 2012 16:11:37 +0100 Subject: Begin modularization of prolog prisoners dilemma implementation --- .gitignore | 2 +- Makefile | 6 +++--- prisoners_dilemma.pl | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ tit4tat.pl | 47 +---------------------------------------------- 4 files changed, 54 insertions(+), 50 deletions(-) create mode 100644 prisoners_dilemma.pl diff --git a/.gitignore b/.gitignore index 5470f73..4007296 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ tit4tat -tit4tatpl +prisoners_dilemma diff --git a/Makefile b/Makefile index 7eb74c0..9f8ad86 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,10 @@ -all: tit4tat tit4tatpl +all: tit4tat prisoners_dilemma tit4tat: tit4tat.c gcc -std=c99 -Wall -o $@ $< -tit4tatpl: tit4tat.pl +prisoners_dilemma: prisoners_dilemma.pl gplc -o $@ $< clean: - rm -f tit4tat tit4tatpl + rm -f tit4tat prisoners_dilemma diff --git a/prisoners_dilemma.pl b/prisoners_dilemma.pl new file mode 100644 index 0000000..66578e8 --- /dev/null +++ b/prisoners_dilemma.pl @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2012 Benjamin Franzke + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +:-initialization(start). + +pay(c,d,1). +pay(d,d,2). +pay(c,c,3). +pay(d,c,4). + +pay2(A, B, PayA, PayB) :- pay(A, B, PayA), pay(B, A, PayB). + +decide(Module, A, Hist, PayA, PayB) :- call(Module, A, Hist, PayA, PayB). + +sum([], 0). +sum([H|T], S) :- sum(T, TMP), S is TMP + H. + +do(e, _, _, _, _) :- !. +do(Choice, Module, Hist, PayedA, PayedB) :- + decide(Module, Choice, Hist, PayA, PayB), + + write('A Pay: '), write(PayA), write('\t'), + write('B Pay: '), write(PayB), write('\t'), + write('A: '), sum([PayA|PayedA], SumA), write(SumA), write('\t'), + write('B: '), sum([PayB|PayedB], SumB), write(SumB), nl, + + loop(Module, [Choice|Hist], [PayA|PayedA], [PayB|PayedB]). + +loop(Module, Hist, PayedA, PayedB) :- + write('Type c,d or e to end: '), read(Choice), + do(Choice, Module, Hist, PayedA, PayedB). + + +start(Module) :- consult(Module), loop(Module, [], [], []), halt. +start :- start(tit4tat). diff --git a/tit4tat.pl b/tit4tat.pl index a4e7664..e03fd5d 100644 --- a/tit4tat.pl +++ b/tit4tat.pl @@ -1,29 +1,4 @@ -/* - * Copyright (c) 2012 Benjamin Franzke - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -:-initialization(start). - -pay(c,d,1). -pay(d,d,2). -pay(c,c,3). -pay(d,c,4). - -pay2(A, B, PayA, PayB) :- pay(A, B, PayA), pay(B, A, PayB). - +% % Use opponents last decision tit4tat_select(H,[H|_]). % Fallback to coorporate at beginning @@ -32,23 +7,3 @@ tit4tat_select(c,[]). tit4tat(A, Hist, PayA, PayB) :- tit4tat_select(Old, Hist), pay2(A, Old, PayA, PayB). - -sum([], 0). -sum([H|T], S) :- sum(T, TMP), S is TMP + H. - -do(e, _, _, _) :- !. -do(Choice, Hist, PayedA, PayedB) :- - tit4tat(Choice, Hist, PayA, PayB), - - write('A Pay: '), write(PayA), write('\t'), - write('B Pay: '), write(PayB), write('\t'), - write('A: '), sum([PayA|PayedA], SumA), write(SumA), write('\t'), - write('B: '), sum([PayB|PayedB], SumB), write(SumB), nl, - - loop([Choice|Hist], [PayA|PayedA], [PayB|PayedB]). - -loop(Hist, PayedA, PayedB) :- - write('Type c,d or e to end: '), read(Choice), - do(Choice, Hist, PayedA, PayedB). - -start :- loop([], [], []), halt. -- cgit