In [1]:
# alternatives to this python client:
# - the online service: https://datalog.db.in.tum.de/
# - the desktop GUI. Just run: java -jar AbcDatalog-0.6.0.jar
In [2]:
import requests
from time import time  # time() is added to GET requests to prevent any caching
#import json  # only required for pretty-print with json.dump()
In [3]:
from mmind import ExpertSystemMasterMind
In [4]:
datalog_kb_folder = r'M:\DEV\github__a_moscatelli\repositories\home\am-wiki-assets\logicprogramming\datalog-kb'
datalog_filename = datalog_kb_folder + '\\mmind-datalog.ps'

servlet_url='http://localhost:8080/AbcDatalogREST'
In [5]:
servlet_url
Out[5]:
'http://localhost:8080/AbcDatalogREST'
In [6]:
from time import ctime
#ctime(time()) # local time like 'Sun Oct 29 17:35:03 YYYY'

conventions¶

In [7]:
# color codes: c0 c1 c2 c3 c4 c5 = red green blue yellow magenta cyan
# h0 h h2 h3 = the four holes
# b = black feedback peg, x = complementary meaning of black

I load the initial KNOWLEDGE BASE KB¶

In [8]:
es = ExpertSystemMasterMind(servlet_url=servlet_url)

es.submitkbfn(datalog_filename=datalog_filename)
ansdict = es.getkbstat()
print('- getkbstat -') #,ansdict)
devnull = [ print(k,':',ansdict[k]) for k in ansdict.keys() ]
delete reply: success= True status_code= 200 text: {"KB size":0,"elapsed_ms":16,"ret_msg":"KB deleted"}

post reply: success= True status_code= 201 text: {"KB size":6659,"elapsed_ms":803,"ret_msg":"KB loaded","uc":"learnmore"}

getkbstat get reply: success= True status_code= 200 text: {"elapsed_ms":0,"ans_kb_text_sz":7064,"ans_kb_load_epoch":"2023-10-30T00:39:26.815Z","ans_kb_sz":53,"ret_msg":"valid KB."}

- getkbstat -
elapsed_ms : 0
ans_kb_text_sz : 7064
ans_kb_load_epoch : 2023-10-30T00:39:26.815Z
ans_kb_sz : 53
ret_msg : valid KB.

possible solutions at start¶

In [9]:
alen = es.print_initial_possible_solutions()
assert alen == 6**4
submitting query: api_isa_solution_exante(CH0,CH1,CH2,CH3)?
submitquery get reply: success= True status_code= 200 elapsed_ms: 0
len(ans): 1296
ans.head 10 :
===
api_isa_solution_exante(c0, c0, c0, c0)
api_isa_solution_exante(c0, c0, c0, c1)
api_isa_solution_exante(c0, c0, c0, c2)
api_isa_solution_exante(c0, c0, c0, c3)
api_isa_solution_exante(c0, c0, c0, c4)
api_isa_solution_exante(c0, c0, c0, c5)
api_isa_solution_exante(c0, c0, c1, c0)
api_isa_solution_exante(c0, c0, c1, c1)
api_isa_solution_exante(c0, c0, c1, c2)
api_isa_solution_exante(c0, c0, c1, c3)
===
In [10]:
assert False

on the game app: I submit my guess n. 1 and I get a feedback. I update the KB:¶

In [11]:
es.learnmore_GuessAndFeedback(gg='c0,c0,c0,c1',fb='b,o,o,o')
adding: api_isa_guess(g0,c0,c0,c0,c1). api_isa_fback(g0,b,o,o,o). % follows(g0,g-1,gg).
post reply: success= True status_code= 201 text: {"KB size":79,"elapsed_ms":1659,"ret_msg":"KB loaded","uc":"learnmore"}

getkbstat get reply: success= True status_code= 200 text: {"elapsed_ms":0,"ans_kb_text_sz":6660,"ans_kb_load_epoch":"2023-10-30T00:39:28.673Z","ans_kb_sz":55,"ret_msg":"valid KB."}

getkbstat(LMGS): {'elapsed_ms': 0, 'ans_kb_text_sz': 6660, 'ans_kb_load_epoch': '2023-10-30T00:39:28.673Z', 'ans_kb_sz': 55, 'ret_msg': 'valid KB.'}
In [12]:
alen=es.print_submitted_guessnfeedbacks()
assert alen==1
submitting query: api_isa_validguessnfeedback(GID,GC0,GC1,GC2,GC3,FC0,FC1,FC2,FC3)?
submitquery get reply: success= True status_code= 200 elapsed_ms: 16
len(ans): 1
ans.head 100 :
===
api_isa_validguessnfeedback(g0, c0, c0, c0, c1, b, o, o, o)
===

I get advice from the Engine (500 options out of 1296), based on the latest updates¶

In [13]:
devnull = es.get_new_advice()
submitting query: api_isa_validguess_evenafter_all_gg(CH0,CH1,CH2,CH3)?
submitquery get reply: success= True status_code= 200 elapsed_ms: 15
len(ans): 500
ans.head 10 :
===
api_isa_validguess_evenafter_all_gg(c0, c1, c1, c0)
api_isa_validguess_evenafter_all_gg(c0, c1, c1, c2)
api_isa_validguess_evenafter_all_gg(c0, c1, c1, c3)
api_isa_validguess_evenafter_all_gg(c0, c1, c1, c4)
api_isa_validguess_evenafter_all_gg(c0, c1, c1, c5)
api_isa_validguess_evenafter_all_gg(c0, c1, c2, c0)
api_isa_validguess_evenafter_all_gg(c0, c1, c2, c2)
api_isa_validguess_evenafter_all_gg(c0, c1, c2, c3)
api_isa_validguess_evenafter_all_gg(c0, c1, c2, c4)
api_isa_validguess_evenafter_all_gg(c0, c1, c2, c5)
===

on the game app: I submit my guess n. 2 and I get a feedback. I update the KB:¶

In [14]:
es.learnmore_GuessAndFeedback(gg='c0, c5, c5, c5',fb='w,o,o,o')
adding: api_isa_guess(g1,c0, c5, c5, c5). api_isa_fback(g1,w,o,o,o).  follows(g1,g0,gg).
post reply: success= True status_code= 201 text: {"KB size":80,"elapsed_ms":4894,"ret_msg":"KB loaded","uc":"learnmore"}

getkbstat get reply: success= True status_code= 200 text: {"elapsed_ms":0,"ans_kb_text_sz":6740,"ans_kb_load_epoch":"2023-10-30T00:39:33.861Z","ans_kb_sz":58,"ret_msg":"valid KB."}

getkbstat(LMGS): {'elapsed_ms': 0, 'ans_kb_text_sz': 6740, 'ans_kb_load_epoch': '2023-10-30T00:39:33.861Z', 'ans_kb_sz': 58, 'ret_msg': 'valid KB.'}
In [15]:
alen=es.print_submitted_guessnfeedbacks()
assert alen==2
submitting query: api_isa_validguessnfeedback(GID,GC0,GC1,GC2,GC3,FC0,FC1,FC2,FC3)?
submitquery get reply: success= True status_code= 200 elapsed_ms: 22
len(ans): 2
ans.head 100 :
===
api_isa_validguessnfeedback(g0, c0, c0, c0, c1, b, o, o, o)
api_isa_validguessnfeedback(g1, c0, c5, c5, c5, w, o, o, o)
===

I get advice from the Engine (176 options), based on the latest updates¶

In [16]:
devnull = es.get_new_advice()
submitting query: api_isa_validguess_evenafter_all_gg(CH0,CH1,CH2,CH3)?
submitquery get reply: success= True status_code= 200 elapsed_ms: 16
len(ans): 176
ans.head 10 :
===
api_isa_validguess_evenafter_all_gg(c1, c0, c1, c0)
api_isa_validguess_evenafter_all_gg(c1, c0, c1, c2)
api_isa_validguess_evenafter_all_gg(c1, c0, c1, c3)
api_isa_validguess_evenafter_all_gg(c1, c0, c1, c4)
api_isa_validguess_evenafter_all_gg(c1, c0, c2, c0)
api_isa_validguess_evenafter_all_gg(c1, c0, c2, c2)
api_isa_validguess_evenafter_all_gg(c1, c0, c2, c3)
api_isa_validguess_evenafter_all_gg(c1, c0, c2, c4)
api_isa_validguess_evenafter_all_gg(c1, c0, c3, c0)
api_isa_validguess_evenafter_all_gg(c1, c0, c3, c2)
===

on the game app: I submit my guess n. 3 and I get a feedback. I update the KB:¶

In [17]:
#ctime(time())
In [18]:
es.learnmore_GuessAndFeedback(gg='c5, c4, c2, c1',fb='b,w,o,o')
adding: api_isa_guess(g2,c5, c4, c2, c1). api_isa_fback(g2,b,w,o,o).  follows(g2,g1,gg).
post reply: success= True status_code= 201 text: {"KB size":80,"elapsed_ms":10498,"ret_msg":"KB loaded","uc":"learnmore"}

getkbstat get reply: success= True status_code= 200 text: {"elapsed_ms":0,"ans_kb_text_sz":6821,"ans_kb_load_epoch":"2023-10-30T00:39:44.576Z","ans_kb_sz":61,"ret_msg":"valid KB."}

getkbstat(LMGS): {'elapsed_ms': 0, 'ans_kb_text_sz': 6821, 'ans_kb_load_epoch': '2023-10-30T00:39:44.576Z', 'ans_kb_sz': 61, 'ret_msg': 'valid KB.'}
In [19]:
#ctime(time()) # 7s later

I get advice from the Engine (40 options), based on the latest updates¶

In [20]:
devnull = es.get_new_advice()
submitting query: api_isa_validguess_evenafter_all_gg(CH0,CH1,CH2,CH3)?
submitquery get reply: success= True status_code= 200 elapsed_ms: 0
len(ans): 40
ans.head 10 :
===
api_isa_validguess_evenafter_all_gg(c1, c0, c2, c0)
api_isa_validguess_evenafter_all_gg(c1, c0, c2, c2)
api_isa_validguess_evenafter_all_gg(c1, c0, c2, c3)
api_isa_validguess_evenafter_all_gg(c1, c0, c2, c4)
api_isa_validguess_evenafter_all_gg(c1, c4, c0, c0)
api_isa_validguess_evenafter_all_gg(c1, c4, c0, c2)
api_isa_validguess_evenafter_all_gg(c1, c4, c0, c3)
api_isa_validguess_evenafter_all_gg(c1, c4, c0, c4)
api_isa_validguess_evenafter_all_gg(c2, c0, c2, c4)
api_isa_validguess_evenafter_all_gg(c2, c4, c0, c0)
===
In [21]:
# ctime(time()) # 0s later

on the game app: I submit my guess n. 4 and I get a feedback. I update the KB:¶

In [22]:
es.learnmore_GuessAndFeedback(gg='c3, c0, c2, c0',fb='b,b,b,o')
adding: api_isa_guess(g3,c3, c0, c2, c0). api_isa_fback(g3,b,b,b,o).  follows(g3,g2,gg).
post reply: success= True status_code= 201 text: {"KB size":80,"elapsed_ms":6717,"ret_msg":"KB loaded","uc":"learnmore"}

getkbstat get reply: success= True status_code= 200 text: {"elapsed_ms":7,"ans_kb_text_sz":6902,"ans_kb_load_epoch":"2023-10-30T00:39:51.471Z","ans_kb_sz":64,"ret_msg":"valid KB."}

getkbstat(LMGS): {'elapsed_ms': 7, 'ans_kb_text_sz': 6902, 'ans_kb_load_epoch': '2023-10-30T00:39:51.471Z', 'ans_kb_sz': 64, 'ret_msg': 'valid KB.'}

I get advice from the Engine (3 options), based on the latest updates¶

In [23]:
devnull = es.get_new_advice()
submitting query: api_isa_validguess_evenafter_all_gg(CH0,CH1,CH2,CH3)?
submitquery get reply: success= True status_code= 200 elapsed_ms: 0
len(ans): 3
ans.head 10 :
===
api_isa_validguess_evenafter_all_gg(c1, c0, c2, c0)
api_isa_validguess_evenafter_all_gg(c3, c0, c2, c4)
api_isa_validguess_evenafter_all_gg(c4, c0, c2, c0)
===

on the game app: I submit my guess n. 5 and I get a feedback. I update the KB:¶

In [24]:
es.learnmore_GuessAndFeedback(gg='c3, c0, c2, c3',fb='b,b,b,o')
adding: api_isa_guess(g4,c3, c0, c2, c3). api_isa_fback(g4,b,b,b,o).  follows(g4,g3,gg).
post reply: success= True status_code= 201 text: {"KB size":80,"elapsed_ms":8302,"ret_msg":"KB loaded","uc":"learnmore"}

getkbstat get reply: success= True status_code= 200 text: {"elapsed_ms":0,"ans_kb_text_sz":6983,"ans_kb_load_epoch":"2023-10-30T00:39:59.896Z","ans_kb_sz":67,"ret_msg":"valid KB."}

getkbstat(LMGS): {'elapsed_ms': 0, 'ans_kb_text_sz': 6983, 'ans_kb_load_epoch': '2023-10-30T00:39:59.896Z', 'ans_kb_sz': 67, 'ret_msg': 'valid KB.'}

I get advice from the Engine (1 option), based on the latest updates¶

In [25]:
ans = es.get_new_advice()
submitting query: api_isa_validguess_evenafter_all_gg(CH0,CH1,CH2,CH3)?
submitquery get reply: success= True status_code= 200 elapsed_ms: 0
len(ans): 1
ans.head 10 :
===
api_isa_validguess_evenafter_all_gg(c3, c0, c2, c4)
===
In [26]:
success = len(ans) == 1
print('success:',success)
success: True

END - success: secret was (c3, c0, c2, c4)¶

In [27]:
es.funnel
Out[27]:
[1296, 500, 176, 40, 3, 1]
In [28]:
[ round(es.funnel[i+1] / es.funnel[i],2) for i in range(len(es.funnel)-1) ] # print next/curr
Out[28]:
[0.39, 0.35, 0.23, 0.07, 0.33]
In [29]:
print(es.funnel == [1296, 500, 176, 40, 3, 1]) # [1296, 500, 240, 92, 6, 2, 1] ignoring the white feedback info.
True
In [30]:
alen=es.print_submitted_guessnfeedbacks()
submitting query: api_isa_validguessnfeedback(GID,GC0,GC1,GC2,GC3,FC0,FC1,FC2,FC3)?
submitquery get reply: success= True status_code= 200 elapsed_ms: 0
len(ans): 5
ans.head 100 :
===
api_isa_validguessnfeedback(g0, c0, c0, c0, c1, b, o, o, o)
api_isa_validguessnfeedback(g1, c0, c5, c5, c5, w, o, o, o)
api_isa_validguessnfeedback(g2, c5, c4, c2, c1, b, w, o, o)
api_isa_validguessnfeedback(g3, c3, c0, c2, c0, b, b, b, o)
api_isa_validguessnfeedback(g4, c3, c0, c2, c3, b, b, b, o)
===
In [31]:
assert alen==5 and success
In [32]:
devnull = es.submitkb(datalog_text="null.",mode="w")
delete reply: success= True status_code= 200 text: {"KB size":0,"elapsed_ms":0,"ret_msg":"KB deleted"}

post reply: success= True status_code= 201 text: {"KB size":5,"elapsed_ms":15,"ret_msg":"KB loaded","uc":"learnmore"}

In [33]:
print('END.')
END.