Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Додаток а






Текст програми системи планування дій робота

у обмеженому робочому просторі

 

// файл Main.h

 

class CMain: public CFrameWnd

{public: void Box(int, bool);

CSemaphore Sema;

void ImplDecision();

void SetTask();

int GetRobotLoc();

void Robot(CPoint);

void Door(int Num, bool State);

void EndTraffic();

void OnTimer(UINT id);

void StartTraffic();

void Space();

int m_X, m_Y;

CDC memDC;

CBitmap Bmp, robot;

CBrush BkBrush;

void OnExit();

void OnPaint();

CMain();

DECLARE_MESSAGE_MAP()

};

 

class CApp: public CWinApp

{public: BOOL InitInstance(); };

 

 

class CCommandForm: public CDialog

{public: void OnShowDecision();

void SetTask(CString, CString, CString);

void OnSubmit();

BOOL OnInitDialog();

CCommandForm(UINT id, CWnd *p): CDialog(id, p){}

DECLARE_MESSAGE_MAP()

private: CComboBox *cb0, *cb1, *cb2;

CButton *bt3;

};

 

class CRobotPlan

{public: CRobotPlan* Revers(CRobotPlan *);

CRobotPlan * delfactall(char *rel, char *n);

char *relname, *agent, *sobj1, *sobj2;

CRobotPlan *next;

CRobotPlan();

CRobotPlan(char *, char *, char *, char *, CRobotPlan *);

CRobotPlan(char *, char *, char *, CRobotPlan *);

void print();

CRobotPlan *dataformer();

CRobotPlan *addfact(char *, char *, char *, char *);

CRobotPlan *delfact(char *, char *, char *, char *);

CRobotPlan *delfact(char *, char *, int, char *);

int dbtest(char*, char*, char*);

int dbtest(char*, char*, char*, char*);

int dbtest(char*, int, char*, char*);

int dbtest(char*, int, char*, int);

CRobotPlan *findfact(char *, char *);

CRobotPlan *findfact(char *, char *, char *);

CRobotPlan *findfact(char *, char *, char *, char *);

CRobotPlan *findfact(char *, int, char *, char *);

CRobotPlan *findfact(char *, int, char *, int);

CRobotPlan *findfact(char *, char *, char *, int);

void deciser();

char *find_action();

void support_action(char*);

void old_cleaner(char*);

void new_adder(char*);

};

 

// файл Мain.cpp

 

// Main.cpp: implementation of the CMain class.

 

#include < afxwin.h>

#include < afxmt.h>

#include < string.h>

#include " Main.h"

#include " n7.h"

#include " resource.h"

 

CListBox *desList;

UINT FirstThread(LPVOID WinObjPtr);

UINT SecondThread(LPVOID WinObjPtr);

UINT ThirdThread(LPVOID WinObjPtr);

UINT FourthThread(LPVOID WinObjPtr);

 

CPoint p1, p2;

 

int maxX, maxY;

bool click;

CPoint rb, pointR1, pointR2, pointR20, pointR3, pointR4, pointR5,

pointD12, pointD23, pointD24, pointD34, pointD45, pointB1, pointB2, pointB3;

 

CMain:: CMain()

{Create(NULL, " Cистема планування дій робота", WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MENU1));

m_X=m_Y=0;

maxX=GetSystemMetrics(SM_CXSCREEN);

maxY=GetSystemMetrics(SM_CYSCREEN);

CClientDC DC(this);

memDC.CreateCompatibleDC(& DC);

Bmp.CreateCompatibleBitmap(& DC, maxX, maxY);

memDC.SelectObject(& Bmp);

BkBrush.CreateStockObject(WHITE_BRUSH);

memDC.SelectObject(& BkBrush);

memDC.PatBlt(0, 0, maxX, maxY, PATCOPY);

robot.LoadBitmap(IDB_BITMAP1);

click=false;

p1=CPoint(575, 175);

rb=CPoint(575, 175);

pointR1=CPoint(75, 40); pointR2=CPoint(350, 40); pointR20=CPoint(225, 40);

pointR3=CPoint(205, 205); pointR4=CPoint(350, 205); pointR5=CPoint(575, 205);

pointD12=CPoint(150, 75); pointD23=CPoint(225, 150); pointD24=CPoint(375, 150);

pointD34=CPoint(300, 225); pointD45=CPoint(500, 225);

pointB1=CPoint(10, 75); pointB2=CPoint(480, 75); pointB3=CPoint(600, 225);

SetTimer(1, 400, NULL);

}

 

BEGIN_MESSAGE_MAP(CMain, CFrameWnd)

ON_WM_PAINT()

ON_WM_TIMER()

ON_COMMAND(ID_EXIT, OnExit)

ON_COMMAND(ID_TRAFFIC_START, StartTraffic)

ON_COMMAND(ID_TRAFFIC_END, EndTraffic)

ON_COMMAND(ID_TASK_SETTASK, SetTask)

ON_COMMAND(ID_TASK_IMPLEMENTDECISION, ImplDecision)

END_MESSAGE_MAP()

 

BOOL CApp:: InitInstance()

{m_pMainWnd=new CMain;

m_pMainWnd-> ShowWindow(m_nCmdShow);

SetPriorityClass(m_pMainWnd, REALTIME_PRIORITY_CLASS);

m_pMainWnd-> UpdateWindow();

return TRUE;

}

 

CApp App;

 

void CMain:: OnPaint()

{CPaintDC dc(this);

dc.BitBlt(0, 0, maxX, maxY, & memDC, 0, 0, SRCCOPY);

}

 

void CMain:: OnExit()

{int i=MessageBox(" Quit the program? ", " Exit", MB_YESNO);

if(i==IDYES)SendMessage(WM_CLOSE);

}

 

bool State12=false, State23=true, State24=true, State34=true, State45=true;

 

void CMain:: Space()

{int room = GetRobotLoc();

CBrush white(RGB(255, 255, 255));

CPen whitePen(PS_SOLID, 2, RGB(255, 255, 255));

memDC.SelectObject(& white); memDC.SelectObject(& whitePen);

memDC.Rectangle(0, 0, 650, 300);

CPen redPen(PS_SOLID, 2, RGB(255, 0, 0));

memDC.SelectObject(& redPen);

memDC.MoveTo(0, 0);

memDC.LineTo(0, 300); memDC.LineTo(650, 300); memDC.LineTo(650, 150);

memDC.LineTo(500, 150); memDC.LineTo(500, 0); memDC.LineTo(0, 0);

memDC.MoveTo(0, 150); memDC.LineTo(200, 150);

memDC.MoveTo(150, 150); memDC.LineTo(150, 100);

memDC.MoveTo(150, 50); memDC.LineTo(150, 0);

 

memDC.MoveTo(250, 150); memDC.LineTo(350, 150);

memDC.MoveTo(400, 150); memDC.LineTo(500, 150);

memDC.LineTo(500, 200); memDC.MoveTo(500, 250); memDC.LineTo(500, 300);

memDC.MoveTo(300, 150);

memDC.LineTo(300, 200); memDC.MoveTo(300, 250); memDC.LineTo(300, 300);

memDC.TextOut(73, 65, " 1", 1); memDC.TextOut(320, 65, " 2", 1);

memDC.TextOut(143, 215, " 3", 1); memDC.TextOut(395, 215, " 4", 1);

memDC.TextOut(570, 215, " 5", 1);

Door(12, State12); Door(23, State23); Door(24, State24);

Door(34, State34); Door(45, State45);

Box(1, true); Box(2, true); Box(3, true);

InvalidateRect(CRect(0, 0, 650, 300));

}

 

int t=0, t2=0, t3=0;

 

void CMain:: StartTraffic()

{for (int i=0; i=20; i++){SetTimer(2, 100, NULL); }

MessageBeep(MB_OK);

}

 

int kt1=0, kt2=0;

 

void CMain:: OnTimer(UINT id)

{if(id==1)

{Space();

Robot(p1);

t++;

}

}

 

void CMain:: EndTraffic()

{

KillTimer(1);

}

 

void CMain:: Door(int Num, bool State)

{CPen bluePen(PS_SOLID, 2, RGB(0, 0, 255));

CPen whitePen(PS_SOLID, 2, RGB(255, 255, 255));

CPoint p1, p2;

switch(Num)

{ case 12: p1=CPoint(150, 100); p2=CPoint(150, 50); break;

case 23: p1=CPoint(200, 150); p2=CPoint(250, 150); break;

case 24: p1=CPoint(350, 150); p2=CPoint(400, 150); break;

case 34: p1=CPoint(300, 250); p2=CPoint(300, 200); break;

case 45: p1=CPoint(500, 250); p2=CPoint(500, 200); break;

}

if(p1.x==p2.x){if(State)

{ memDC.SelectObject(& whitePen);

memDC.MoveTo(p1.x-3, p1.y+47); memDC.LineTo(p1.x-3, p1.y+1);

memDC.SelectObject(& bluePen);

memDC.MoveTo(p1.x-3, p1.y-1); memDC.LineTo(p1.x-3, p2.y+1);

}

else

{ memDC.SelectObject(& whitePen);

memDC.MoveTo(p1.x-3, p1.y-1); memDC.LineTo(p1.x-3, p2.y+1);

memDC.SelectObject(& bluePen);

memDC.MoveTo(p1.x-3, p1.y+47); memDC.LineTo(p1.x-3, p1.y+1);

}

}

if(p1.y==p2.y){if(State)

{ memDC.SelectObject(& whitePen);

memDC.MoveTo(p2.x+1, p1.y+3); memDC.LineTo(p2.x+47, p1.y+3);

memDC.SelectObject(& bluePen);

memDC.MoveTo(p1.x+1, p1.y+3); memDC.LineTo(p2.x-1, p1.y+3);

}

else

{ memDC.SelectObject(& whitePen);

memDC.MoveTo(p1.x+1, p1.y+3); memDC.LineTo(p2.x-1, p1.y+3);

memDC.SelectObject(& bluePen);

memDC.MoveTo(p2.x+1, p1.y+3); memDC.LineTo(p2.x+47, p1.y+3);

}

}

}

 

void CMain:: Robot(CPoint pp)

{ int x=pp.x, y=pp.y;

CDC mdc;

mdc.CreateCompatibleDC(& memDC);

mdc.SelectObject(& robot);

BITMAP map;

robot.GetBitmap(& map);

InvalidateRect(CRect(rb.x, rb.y, rb.x+50, rb.y+50));

memDC.BitBlt(x, y, map.bmWidth, map.bmHeight, & mdc, 0, 0, SRCCOPY);

}

 

int CMain:: GetRobotLoc()

{ if(rb.x> 0 & & rb.x< 149 & & rb.y> 0 & & rb.y< 149) return 1;

if(rb.x> 151 & & rb.x< 500 & & rb.y> 0 & & rb.y< 149) return 2;

if(rb.x> 0 & & rb.x< 300 & & rb.y> 151 & & rb.y< 300) return 3;

if(rb.x> 301 & & rb.x< 500 & & rb.y> 151 & & rb.y< 300) return 4;

if(rb.x> 501 & & rb.x< 650 & & rb.y> 151 & & rb.y< 300) return 5;

else return 0;

}

 

void CMain:: SetTask()

{

CCommandForm cf(IDD_DIALOG1, this);

cf.DoModal();

}

 

BEGIN_MESSAGE_MAP(CCommandForm, CDialog)

ON_COMMAND(IDC_BUTTON1, OnSubmit)

ON_COMMAND(IDC_BUTTON2, OnShowDecision)

END_MESSAGE_MAP()

 

BOOL CCommandForm:: OnInitDialog()

{ CDialog:: OnInitDialog();

cb0=(CComboBox*)GetDlgItem(IDC_COMBO0);

cb1=(CComboBox*)GetDlgItem(IDC_COMBO1);

cb2=(CComboBox*)GetDlgItem(IDC_COMBO2);

bt3=(CButton*)GetDlgItem(IDC_BUTTON2);

desList=(CListBox*)GetDlgItem(IDC_LIST1);

cb0-> AddString(" робот"); cb0-> AddString(" скринька1");

cb0-> AddString(" скринька2"); cb0-> AddString(" скринька3");

cb1-> AddString(" перейти_до"); cb1-> AddString(" штовхати_до");

cb1-> AddString(" відкрити"); cb1-> AddString(" закрити");

cb2-> AddString(" скринька1"); cb2-> AddString(" скринька2");

cb2-> AddString(" скринька3"); cb2-> AddString(" двері12");

cb2-> AddString(" двері23"); cb2-> AddString(" двері24");

cb2-> AddString(" двері34"); cb2-> AddString(" двері45");

cb2-> AddString(" кімната_1"); cb2-> AddString(" кімната_2");

cb2-> AddString(" кімната_3"); cb2-> AddString(" кімната_4");

cb2-> AddString(" кімната_5");

bt3-> EnableWindow(FALSE);

return TRUE;

}

 

void CCommandForm:: OnSubmit()

{ CString a0, a1, a2;

int i0, i1;

cb0-> GetWindowText(a0); i0=cb0-> GetCurSel();

cb1-> GetWindowText(a1); i1=cb1-> GetCurSel();

cb2-> GetWindowText(a2);

int lk=desList-> GetCount();

for(int ik=0; ik< lk; ik++)desList-> DeleteString(0);

if(! strlen(a0)||! strlen(a1)||! strlen(a2))

MessageBox(" Запит сформовано невірно", " Помилка", MB_ICONSTOP);

else if(i0==0 & & i1==1)MessageBox(" Запит сформовано невірно", " Помилка", MB_ICONSTOP);

else if(i0> 0 & & i1! =1)

MessageBox(" Запит сформовано невірно", " Помилка", MB_ICONSTOP);

else if(! strcmp(a0, a2))

MessageBox(" Запит сформовано невірно", " Помилка", MB_ICONSTOP);

else SetTask(a0, a1, a2);

}

 

CRobotPlan *evil=new CRobotPlan;

CRobotPlan *sub_evil;

CRobotPlan *plan=new CRobotPlan;

bool decision=false;

 

void CCommandForm:: SetTask(CString a, CString b, CString c)

{ CRobotPlan *goal;

evil=evil-> dataformer();

sub_evil=evil;

CString d;

d=a+b+c;

char *a1, *b1, *c1;

if(a==" робот") {a=" robot"; a1=" robot"; }

if(a==" скринька1") {a=" box1"; a1=" box1"; }

if(a==" скринька2") {a=" box2"; a1=" box2"; }

if(a==" скринька3") {a=" box3"; a1=" box3"; }

if(b==" перейти_до") {b=" go"; }

if(b==" штовхати_до"){b=" push"; }

if(b==" відкрити") {b=" open"; b1=" opened"; }

if(b==" закрити") {b=" close"; b1=" closed"; }

if(c==" скринька1") {c=" box1"; c1=" box1"; }

if(c==" скринька2") {c=" box2"; c1=" box2"; }

if(c==" скринька3") {c=" box3"; c1=" box3"; }

if(c==" двері12") {c=" door12"; c1=" door12"; }

if(c==" двері23") {c=" door23"; c1=" door23"; }

if(c==" двері24") {c=" door24"; c1=" door24"; }

if(c==" двері34") {c=" door34"; c1=" door34"; }

if(c==" двері45") {c=" door45"; c1=" door45"; }

if(c==" кімната_1") {c=" room1"; c1=" room1"; }

if(c==" кімната_2") {c=" room2"; c1=" room2"; }

if(c==" кімната_3") {c=" room3"; c1=" room3"; }

if(c==" кімната_4") {c=" room4"; c1=" room4"; }

if(c==" кімната_5") {c=" room5"; c1=" room5"; }

if(a==" robot" & & b==" go" & &

(c==" room1" || c==" room2" ||c==" room3" ||c==" room4" ||c==" room5"))

{goal=new CRobotPlan(" is_in", a1, c1, NULL); // tested

goal-> deciser();

}

if(a==" robot" & & b==" go" & &

(c==" box1" || c==" box2" || c==" box3"))

{goal=new CRobotPlan(" is_at", a1, c1, NULL); // tested

goal-> deciser();

}

if(a==" robot" & & b==" go" & &

(c==" door12" || c==" door23" ||c==" door24" ||c==" door34" ||c==" door45"))

{goal=new CRobotPlan(" is_at", a1, c1, NULL); // tested

goal-> deciser();

}

if(a==" robot" & & (b==" close" || b==" open") & &

(c==" door12" || c==" door23" ||c==" door24" ||c==" door34" ||c==" door45"))

{goal=new CRobotPlan(" stands", c1, b1, NULL); // tested

goal-> deciser();

}

if(a==" box1" || a==" box2" || a==" box3" & & b==" push")

{if(c==" door12" || c==" door23" ||c==" door24" ||c==" door34" ||c==" door45")

{goal=new CRobotPlan(" is_at", a1, c1, NULL); // tested

goal-> deciser();

}

if(c==" room1" || c==" room2" ||c==" room3" ||c==" room4" ||c==" room5")

{goal=new CRobotPlan(" is_in", a1, c1, NULL); // tested

goal-> deciser();

}

if(c==" box1" || c==" box2" || c==" box3")

{goal=new CRobotPlan(" is_at", a1, c1, NULL); // tested

goal-> deciser();

}

}

desList-> AddString(" +++ The END +++");

decision=true;

bt3-> EnableWindow();

}

 

void CMain:: ImplDecision()

{ if(decision)

{plan=plan-> Revers(plan);

while(plan-> next)

{CString ss;

ss.Format(_T(" %s %s %s"), plan-> relname, plan-> agent, plan-> sobj1);

if(plan-> relname==" stands")

{if(plan-> agent==" door12")

{if(plan-> sobj1==" opened")State12=false;

else State12=true;

}

if(plan-> agent==" door23")

{if(plan-> sobj1==" opened")State23=false;

else State23=true;

}

if(plan-> agent==" door24")

{if(plan-> sobj1==" opened")State24=false;

else State24=true;

}

if(plan-> agent==" door34")

{if(plan-> sobj1==" opened")State34=false;

else State34=true;

}

if(plan-> agent==" door45")

{if(plan-> sobj1==" opened")State45=false;

else State45=true;

}

}

if(plan-> relname==" is_in")

{if(plan-> agent==" robot")

{ int r=GetRobotLoc();

if(plan-> sobj1==" room4")

{if(r==5){p1=CPoint(pointR5);

p2=CPoint(pointR4);

AfxBeginThread(FirstThread, this);

}

if(r==2){p1=CPoint(pointR2);

p2=CPoint(pointR4);

AfxBeginThread(FourthThread, this);

}

}

if(plan-> sobj1==" room2")

{if(r==4){p1=CPoint(pointR4);

p2=CPoint(pointR2);

AfxBeginThread(ThirdThread, this);

}

if(r==1){p1=CPoint(pointR1);

p2=CPoint(pointR20);

AfxBeginThread(SecondThread, this);

}

if(r==3){p1=CPoint(pointR1);

p2=CPoint(pointR20);

AfxBeginThread(ThirdThread, this);

}

}

if(plan-> sobj1==" room1")

{if(r==2){p1=CPoint(pointR20);

p2=CPoint(pointR1);

AfxBeginThread(FirstThread, this);

}

}

if(plan-> sobj1==" room3")

{if(r==2){p1=CPoint(pointR20);

p2=CPoint(pointR3);

AfxBeginThread(FourthThread, this);

}

if(r==4){p1=CPoint(pointR4);

p2=CPoint(pointR3);

AfxBeginThread(FirstThread, this);

}

}

if(plan-> sobj1==" room5")

{if(r==4){p1=CPoint(pointR4);

p2=CPoint(pointR5);

AfxBeginThread(SecondThread, this);

}

}

}

}

if(plan-> relname==" is_at")

{if(plan-> agent==" robot")

{ int r=GetRobotLoc();

if(plan-> sobj1==" door12")

{ if(r==2){p1=CPoint(pointR20);

p2=CPoint(pointD12);

AfxBeginThread(FirstThread, this);

}

if(r==1){p1=CPoint(pointR1);

p2=CPoint(pointD12);

AfxBeginThread(SecondThread, this);

}

}

if(plan-> sobj1==" door24")

{ if(r==2){p1=CPoint(pointR2);

p2=CPoint(pointD24);

AfxBeginThread(FourthThread, this);

}

if(r==4){p1=CPoint(pointR4);

p2=CPoint(pointD24);

AfxBeginThread(ThirdThread, this);

}

}

if(plan-> sobj1==" door23")

{ if(r==2){p1=CPoint(pointR20);

p2=CPoint(pointD23);

AfxBeginThread(FourthThread, this);

}

if(r==3){p1=CPoint(pointR3);

p2=CPoint(pointD23);

AfxBeginThread(ThirdThread, this);

}

}

if(plan-> sobj1==" door34")

{ if(r==3){p1=CPoint(pointR3);

p2=CPoint(pointD34);

AfxBeginThread(SecondThread, this);

}

if(r==4){p1=CPoint(pointR4);

p2=CPoint(pointD34);

AfxBeginThread(FirstThread, this);

}

}

if(plan-> sobj1==" door45")

{ if(r==4){p1=CPoint(pointR4);

p2=CPoint(pointD45);

AfxBeginThread(SecondThread, this);

}

if(r==5){p1=CPoint(pointR5);

p2=CPoint(pointD45);

AfxBeginThread(FirstThread, this);

}

}

}

if(plan-> agent==" box1")

{if(plan-> sobj1==" box2"){p1=CPoint(pointR2); p2=CPoint(pointD12);

AfxBeginThread(FirstThread, this); };

if(plan-> sobj1==" box3"){p1=CPoint(pointR4); p2=CPoint(pointD24);

AfxBeginThread(ThirdThread, this); };

}

if(plan-> agent==" box2")

{if(plan-> sobj1==" box1"){p1=CPoint(pointR2); p2=CPoint(pointD12);

AfxBeginThread(FirstThread, this); };

if(plan-> sobj1==" box3"){p1=CPoint(pointR4); p2=CPoint(pointD24);

AfxBeginThread(ThirdThread, this); };

}

if(plan-> agent==" box3")

{if(plan-> sobj1==" box1"){p1=CPoint(pointR2); p2=CPoint(pointD12);

AfxBeginThread(FirstThread, this); };

if(plan-> sobj1==" box2"){p1=CPoint(pointR4); p2=CPoint(pointD24);

AfxBeginThread(ThirdThread, this); };

}

}

plan=plan-> next;

MessageBox(ss);

}

}

}

 

UINT FirstThread(LPVOID WinObjPtr)

{ CMain *ptr=(CMain*)WinObjPtr;

CSingleLock SyncOb(& (ptr-> Sema));

SyncOb.Lock();

while(p1.x> =p2.x){p1.Offset(-t*0.1, 0); Sleep(200); ptr-> Robot(p1); }

rb=CPoint(p2);

SyncOb.Unlock();

return 0;

}

 

UINT SecondThread(LPVOID WinObjPtr)

{ CMain *ptr=(CMain*)WinObjPtr;

CSingleLock SyncOb(& (ptr-> Sema));

SyncOb.Lock();

while(p1.x< =p2.x){p1.Offset(t*0.1, 0); Sleep(200); ptr-> Robot(p1); }

rb=CPoint(p2);

SyncOb.Unlock();

return 0;

}

 

UINT ThirdThread(LPVOID WinObjPtr)

{ CMain *ptr=(CMain*)WinObjPtr;

CSingleLock SyncOb(& (ptr-> Sema));

SyncOb.Lock();

while(p1.y> p2.y){p1.Offset(0, -t*0.1); Sleep(200); ptr-> Robot(p1); }

rb=CPoint(p2);

SyncOb.Unlock();

return 0;

}

 

UINT FourthThread(LPVOID WinObjPtr)

{ CMain *ptr=(CMain*)WinObjPtr;

CSingleLock SyncOb(& (ptr-> Sema));

SyncOb.Lock();

while(p1.y< p2.y){p1.Offset(0, t*0.1); Sleep(200); ptr-> Robot(p1); }

rb=CPoint(p2);

SyncOb.Unlock();

return 0;

}

 

void CCommandForm:: OnShowDecision()

{ CMain *wm;

wm=(CMain*)GetParent();

wm-> ImplDecision();

}

 

void CMain:: Box(int num, bool state)

{if(state)

{CBrush redBrush(RGB(255, 0, 0));

memDC.SelectObject(& redBrush);

if(num==1)memDC.Rectangle(10, 75, 30, 95);

if(num==2)memDC.Rectangle(480, 75, 500, 95);

if(num==3)memDC.Rectangle(630, 225, 650, 245);

}

else

{CBrush whiteBrush(RGB(255, 255, 255));

memDC.SelectObject(& whiteBrush);

if(num==1)memDC.Rectangle(10, 75, 30, 95);

if(num==2)memDC.Rectangle(480, 75, 500, 95);

if(num==3)memDC.Rectangle(630, 225, 650, 245);

}

}

 

// файл n7.cpp

#include < iostream.h>

#include < string.h>

#include < conio.h>

#include < afxwin.h>

#include" n7.h"

 

extern CRobotPlan *evil;

extern CRobotPlan *sub_evil;

extern CRobotPlan *plan;

extern CListBox *desList;

 

void CRobotPlan:: deciser()

{if(! evil-> dbtest(relname, agent, sobj1, sobj2))

{char *action=find_action();

if (action){ support_action(action);

old_cleaner(action);

new_adder(action);

}

}

}

 

void CRobotPlan:: support_action(char *action)

{if(! (strcmp(action, " take_box")))

{CRobotPlan *subgoal=new CRobotPlan(" is_at", " robot", sobj1, NULL);

subgoal-> deciser(); }

 

if(! (strcmp(action, " put_box")))

{ }

 

if(! (strcmp(action, " open_door")))

{CRobotPlan *subgoal=new CRobotPlan(" is_at", " robot", agent, NULL);

subgoal-> deciser(); }

 

if(! (strcmp(action, " close_door")))

{CRobotPlan *subgoal=new CRobotPlan(" is_at", " robot", agent, NULL);

subgoal-> deciser(); }

 

if(! (strcmp(action, " goto_door")))

{char *room0=evil-> findfact(" is_in", agent)-> sobj1;

char *room1=evil-> findfact(" connects", sobj1)-> sobj1; // where is door

char *room2=evil-> findfact(" connects", sobj1, room1, 0)-> sobj2; // where is door

if((strcmp(room0, room1)) & & (strcmp(room0, room2)))

{CRobotPlan *subgoal=new CRobotPlan(" is_in", " robot", room1, NULL);

subgoal-> deciser();

}

}

 

if(! (strcmp(action, " goto_box")))

{char *room=evil-> findfact(" is_in", sobj1)-> sobj1; // where is object

CRobotPlan *subgoal=new CRobotPlan(" is_in", " robot", room, NULL);

subgoal-> deciser();

}

 

if(! (strcmp(action, " move_box")))

{CRobotPlan *subgoal02=new CRobotPlan(" is_with", " robot", agent, NULL);

subgoal02-> deciser();

CRobotPlan *subgoal03=new CRobotPlan(" is_at", " robot", sobj1, NULL);

subgoal03-> deciser();

CRobotPlan *subgoal04=new CRobotPlan(" is_with", " robot", " empty", NULL);

subgoal04-> deciser();

}

 

if(! (strcmp(action, " push_box")))

{CRobotPlan *subgoal02=new CRobotPlan(" is_with", " robot", agent, NULL);

subgoal02-> deciser();

CRobotPlan *subgoal03=new CRobotPlan(" is_at", " robot", sobj1, NULL);

subgoal03-> deciser();

CRobotPlan *subgoal04=new CRobotPlan(" is_with", " robot", " empty", NULL);

subgoal04-> deciser();

}

 

if(! (strcmp(action, " push_box_other_room")))

{

CRobotPlan *subgoal02=new CRobotPlan(" is_with", " robot", agent, NULL);

subgoal02-> deciser();

CRobotPlan *subgoal03=new CRobotPlan(" is_in", " robot", sobj1, NULL);

subgoal03-> deciser();

CRobotPlan *subgoal04=new CRobotPlan(" is_with", " robot", " empty", NULL);

subgoal04-> deciser();

}

 

if(! (strcmp(action, " go_other_room")))

{

char *room=evil-> findfact(" is_in", agent)-> sobj1; //where is robot

if(evil-> findfact(" connects", 0, room, sobj1)-> agent)

{char *door=evil-> findfact(" connects", 0, room, sobj1)-> agent; //what's door

CRobotPlan *subgoal=new CRobotPlan(" is_at", " robot", door, NULL);

subgoal-> deciser();

CRobotPlan *subgoal1=new CRobotPlan(" stands", door, " opened", NULL);

subgoal1-> deciser();

}

}

 

if(! (strcmp(action, " go_far_room")))

{

char *room=evil-> findfact(" is_in", agent)-> sobj1; //where is robot

char *room1; int cc;

do

{cc=1;

sub_evil-> findfact(" connects", 0, room, 0);

room1=sub_evil-> findfact(" connects", 0, room, 0)-> sobj2;

if(evil-> dbtest(" was_in", " robot", room1)

)

{sub_evil=sub_evil-> next;

}

else cc=0;

}while(cc);

CRobotPlan *subgoal=new CRobotPlan(" is_in", " robot", room1, NULL);

subgoal-> deciser();

CRobotPlan *subgoal1=new CRobotPlan(" is_in", " robot", sobj1, NULL);

subgoal1-> deciser();

}

}

 

void CRobotPlan:: old_cleaner(char *action)

{print();

plan = new CRobotPlan(relname, agent, sobj1, NULL, plan);

if(! (strcmp(action, " take_box")))

{evil=evil-> delfact(" is_at", agent, 0, NULL);

evil=evil-> delfact(" is_with", agent, 0, NULL);

evil=evil-> delfact(" is_in", sobj1, 0, NULL);

}

 

if(! (strcmp(action, " put_box")))

{evil=evil-> addfact(" is_in", evil-> findfact(" is_with", agent)-> sobj1,

evil-> findfact(" is_in", agent)-> sobj1, NULL);

evil=evil-> delfact(" is_with", agent, 0, NULL);

}

 

if(! (strcmp(action, " open_door")))

{evil=evil-> delfact(" stands", agent, " closed", NULL); }

 

if(! (strcmp(action, " close_door")))

{evil=evil-> delfact(" stands", agent, " opened", NULL); }

 

if(! (strcmp(action, " goto_door")))

{evil=evil-> delfact(" is_at", agent, 0, NULL); }

 

if(! (strcmp(action, " move_box")))

{evil=evil-> delfact(" is_at", " robot", 0, NULL); } // robot is_at some

 

if(! (strcmp(action, " goto_box")))

{evil=evil-> delfact(" is_at", " robot", 0, NULL); }

 

if(! (strcmp(action, " push_box")))

{evil=evil-> delfact(" is_at", " robot", 0, NULL); }

 

if(! (strcmp(action, " go_other_room")))

{char *room=evil-> findfact(" is_in", agent)-> sobj1;

evil=evil-> delfact(" is_in", " robot", 0, NULL);

evil=evil-> delfact(" is_at", " robot", 0, NULL);

evil=evil-> addfact(" was_in", " robot", room, NULL);

}

 

if(! (strcmp(action, " push_box_other_room")))

{evil=evil-> delfact(" is_in", " robot", 0, NULL);

evil=evil-> delfact(" is_at", " robot", 0, NULL);

evil=evil-> delfact(" is_in", agent, 0, NULL);

evil=evil-> delfact(" is_at", agent, 0, NULL);

}

 

if(! (strcmp(action, " go_far_room")))

{evil=evil-> delfact(" is_at", " robot", 0, NULL);

evil=evil-> delfactall(" was_in", " robot");

}

}

 

void CRobotPlan:: new_adder(char *action)

{

if(! (strcmp(action, " take_box")))

evil=evil-> addfact(" is_with", agent, sobj1, NULL);

 

if(! (strcmp(action, " put_box")))

evil=evil-> addfact(" is_with", agent, " empty", NULL);

 

if(! (strcmp(action, " open_door")))

evil=evil-> addfact(" stands", agent, " opened", NULL);

 

if(! (strcmp(action, " close_door")))

evil=evil-> addfact(" stands", agent, " closed", NULL);

 

if(! (strcmp(action, " goto_door")))

evil=evil-> addfact(" is_at", " robot", sobj1, NULL);

 

if(! (strcmp(action, " move_box")))

{evil=evil-> addfact(" is_at", " robot", sobj1, NULL);

evil=evil-> addfact(" is_at", agent, sobj1, NULL);

}

 

if(! (strcmp(action, " goto_box")))

evil=evil-> addfact(" is_at", " robot", sobj1, NULL);

 

if(! (strcmp(action, " push_box")))

{evil=evil-> addfact(" is_at", " robot", sobj1, NULL);

evil=evil-> addfact(" is_at", agent, sobj1, NULL);

}

 

if(! (strcmp(action, " go_other_room")))

evil=evil-> addfact(" is_in", agent, sobj1, NULL);

 

if(! (strcmp(action, " push_box_other_room")))

{evil=evil-> addfact(" is_in", agent, sobj1, NULL);

evil=evil-> addfact(" is_in", " robot", sobj1, NULL);

}

 

if(! (strcmp(action, " go_far_room"))) {}

}

 

CRobotPlan:: CRobotPlan(){relname=NULL; agent=NULL;

sobj1=NULL; sobj2=NULL; next=NULL; }

 

CRobotPlan:: CRobotPlan(char *rel, char *n, char *n1, char *n2, CRobotPlan *ff)

{relname=rel; agent=n; sobj1=n1; sobj2=n2; next=ff; }

 

CRobotPlan:: CRobotPlan(char *rel, char *n, char *n1, CRobotPlan *ff)

{relname=rel; agent=n; sobj1=n1; sobj2=NULL; next=ff; }

 

void CRobotPlan:: print()

{ if(this){

if(! strcmp(relname, " is_in") ||! strcmp(relname, " is_at") ||

! strcmp(relname, " stands") ||! strcmp(relname, " is_with") ||! strcmp(relname, " was_in")

)

{CString des;

if(sobj2) des.Format(_T(" %s %s %s %s"), relname, agent, sobj1, sobj2);

else des.Format(_T(" %s %s %s"), relname, agent, sobj1);

desList-> AddString(des); }

next-> print(); }}

 

 

CRobotPlan *CRobotPlan:: addfact(char *rel, char *n, char *n1, char *n2)

{CRobotPlan *a=new CRobotPlan(rel, n, n1, n2, evil); return a; };

 

CRobotPlan *CRobotPlan:: delfact(char *rel, char *n, int i, char *n2)

{if(next)

{if(n2)

{if(! strcmp(relname, rel) & &! strcmp(agent, n) & &

! strcmp(sobj2, n2))

return next;

if(! strcmp(next-> relname, rel) & &! strcmp(next-> agent, n) & &

! strcmp(next-> sobj2, n2))

next=next-> next;

else next-> delfact(rel, n, i, n2);

}

else

{if(! strcmp(relname, rel) & &! strcmp(agent, n))

return next;

if(! strcmp(next-> relname, rel) & &! strcmp(next-> agent, n))

next=next-> next;

else next-> delfact(rel, n, i, n2);

}

}

return this;

}

 

CRobotPlan *CRobotPlan:: delfact(char *rel, char *n, char *n1, char *n2)

{if(next)

{if(n2)

{

if(! strcmp(relname, rel) & &! strcmp(agent, n) & &

! strcmp(sobj1, n1) & &! strcmp(sobj2, n2))

return next;

if(! strcmp(next-> relname, rel) & &! strcmp(next-> agent, n) & &

! strcmp(next-> sobj1, n1) & &! strcmp(next-> sobj2, n2))

next=next-> next;

else next-> delfact(rel, n, n1, n2);

}

else

{if(! strcmp(relname, rel) & &! strcmp(agent, n) & &

! strcmp(sobj1, n1))

return next;

if(! strcmp(next-> relname, rel) & &! strcmp(next-> agent, n) & &

! strcmp(next-> sobj1, n1))

next=next-> next;

else next-> delfact(rel, n, n1, n2);

}

}

return this;

}

 

CRobotPlan *CRobotPlan:: dataformer()

{CRobotPlan *a1=new CRobotPlan(" is_a", " room1", " room", NULL, NULL);

CRobotPlan *a2=new CRobotPlan(" is_a", " room2", " room", NULL, a1);

CRobotPlan *a3=new CRobotPlan(" is_a", " room3", " room", NULL, a2);

CRobotPlan *a4=new CRobotPlan(" is_a", " room4", " room", NULL, a3);

CRobotPlan *a5=new CRobotPlan(" is_a", " room5", " room", NULL, a4);

CRobotPlan *a6=new CRobotPlan(" is_a", " door12", " door", NULL, a5);

CRobotPlan *a7=new CRobotPlan(" is_a", " door23", " door", NULL, a6);

CRobotPlan *a8=new CRobotPlan(" is_a", " door24", " door", NULL, a7);

CRobotPlan *a9=new CRobotPlan(" is_a", " door34", " door", NULL, a8);

CRobotPlan *a10=new CRobotPlan(" is_a", " door45", " door", NULL, a9);

CRobotPlan *a11=new CRobotPlan(" is_a", " box1", " box", NULL, a10);

CRobotPlan *a12=new CRobotPlan(" is_a", " box2", " box", NULL, a11);

CRobotPlan *a13=new CRobotPlan(" is_a", " box3", " box", NULL, a12);

CRobotPlan *a14=new CRobotPlan(" is_in", " robot", " room5", NULL, a13);

CRobotPlan *a15=new CRobotPlan(" is_in", " box1", " room1", NULL, a14);

CRobotPlan *a16=new CRobotPlan(" is_in", " box2", " room2", NULL, a15);

CRobotPlan *a17=new CRobotPlan(" is_in", " box3", " room5", NULL, a16);

CRobotPlan *a18=new CRobotPlan(" stands", " door12", " opened", NULL, a17);

CRobotPlan *a19=new CRobotPlan(" stands", " door23", " closed", NULL, a18);

CRobotPlan *a20=new CRobotPlan(" stands", " door24", " closed", NULL, a19);

CRobotPlan *a21=new CRobotPlan(" stands", " door34", " closed", NULL, a20);

CRobotPlan *a22=new CRobotPlan(" stands", " door45", " closed", NULL, a21);

CRobotPlan *a23=new CRobotPlan(" connects", " door12", " room1", " room2", a22);

CRobotPlan *a24=new CRobotPlan(" connects", " door12", " room2", " room1", a23);

CRobotPlan *a25=new CRobotPlan(" connects", " door23", " room2", " room3", a24);

CRobotPlan *a26=new CRobotPlan(" connects", " door23", " room3", " room2", a25);

CRobotPlan *a27=new CRobotPlan(" connects", " door24", " room2", " room4", a26);

CRobotPlan *a28=new CRobotPlan(" connects", " door24", " room4", " room2", a27);

CRobotPlan *a29=new CRobotPlan(" connects", " door34", " room3", " room4", a28);

CRobotPlan *a30=new CRobotPlan(" connects", " door34", " room4", " room3", a29);

CRobotPlan *a31=new CRobotPlan(" connects", " door45", " room4", " room5", a30);

CRobotPlan *a32=new CRobotPlan(" connects", " door45", " room5", " room4", a31);

CRobotPlan *a33=new CRobotPlan(" is_at", " robot", " door45", NULL, a32);

CRobotPlan *a34=new CRobotPlan(" is_a", " robot", " robot", NULL, a33);

CRobotPlan *a35=new CRobotPlan(" is_with", " robot", " empty", NULL, a34);

return a35;

}

 

int CRobotPlan:: dbtest(char *a, char *b, char *c, char *d)

{if(this)

{if(d){if(! strcmp(relname, a) & &! strcmp(agent, b) & &

! strcmp(sobj1, c) & &! strcmp(sobj2, d))

return 1;

else return next-> dbtest(a, b, c, d);

}

else {if(! strcmp(relname, a) & &! strcmp(agent, b) & &! strcmp(sobj1, c))

return 1;

else return next-> dbtest(a, b, c, d);

}

}

return 0;

}

int CRobotPlan:: dbtest(char *a, char *b, char *c)

{if(this)

{if(! strcmp(relname, a) & &! strcmp(agent, b) & &! strcmp(sobj1, c))

return 1;

else return next-> dbtest(a, b, c);

}

return 0;

}

 

int CRobotPlan:: dbtest(char *a, int i, char *c, char *d)

{if(this)

{ if(d)

{if(! strcmp(relname, a) & &! strcmp(sobj1, c) & &! strcmp(sobj2, d))

return 1;

else return next-> dbtest(a, i, c, d);

}

else {if(! strcmp(relname, a) & &! strcmp(sobj1, c))

return 1;

else return next-> dbtest(a, i, c, d);

}

}

return 0;

}

 

int CRobotPlan:: dbtest(char *a, int i, char *c, int j)

{if(this)

{if(! strcmp(relname, a) & &! strcmp(sobj1, c))

return 1;

else return next-> dbtest(a, i, c, j);

}

return 0;

}

 

CRobotPlan *CRobotPlan:: findfact(char *a, char *b)

{if(this)

{if(! strcmp(relname, a) & &! strcmp(agent, b))

{CRobotPlan *w=new CRobotPlan(a, b, sobj1, NULL); return w; }

else return next-> findfact(a, b);

}

return NULL;

}

 

CRobotPlan *CRobotPlan:: findfact(char *a, char *b, char *c)

{if(this)

{if(! strcmp(relname, a) & &! strcmp(agent, b) & &! strcmp(sobj1, c))

{CRobotPlan *w=new CRobotPlan(a, b, c, NULL); return w; }

else return next-> findfact(a, b, c);

}

return NULL;

}

 

CRobotPlan *CRobotPlan:: findfact(char *a, char *b, char *c, char *d)

{if(this)

{if(! strcmp(relname, a) & &! strcmp(agent, b) & &

! strcmp(sobj1, c) & &! strcmp(sobj2, d))

{CRobotPlan *w=new CRobotPlan(a, b, c, d, NULL);

return w; }

else return next-> findfact(a, b, c, d);

}

return NULL;

}

 

CRobotPlan *CRobotPlan:: findfact(char *a, char *b, char *c, int i)

{if(this)

{if(! strcmp(relname, a) & &! strcmp(agent, b) & &

! strcmp(sobj1, c))

{CRobotPlan *w=new CRobotPlan(a, b, c, sobj2, NULL);

return w; }

else return next-> findfact(a, b, c, i);

}

return NULL;

}

 

CRobotPlan *CRobotPlan:: findfact(char *a, int i, char *c, char *d)

{if(this)

{if(! strcmp(relname, a) & &! strcmp(sobj1, c) & &! strcmp(sobj2, d))

{CRobotPlan *w=new CRobotPlan(a, agent, c, d, NULL);

return w; }

else return next-> findfact(a, i, c, d);

}

return NULL;

}

 

CRobotPlan *CRobotPlan:: findfact(char *a, int i, char *c, int j)

{if(this)

{if(! strcmp(relname, a) & &! strcmp(sobj1, c))

{CRobotPlan *w=new CRobotPlan(a, agent, c, sobj2, NULL);

return w; }

else return next-> findfact(a, i, c, j);

}

return NULL;

}

 

char *CRobotPlan:: find_action()

{

 

if(evil-> dbtest(" is_a", agent, " door") & &

evil-> dbtest(" stands", agent, " closed"))

return " open_door";

 

if(evil-> dbtest(" is_a", agent, " door") & &

evil-> dbtest(" stands", agent, " opened"))

return " close_door";

 

if(! (strcmp(relname, " is_with")) & &

evil-> dbtest(" is_a", sobj1, " box") & &

evil-> dbtest(" is_with", agent, " empty"))

return " take_box";

 

if(! (strcmp(relname, " is_with")) & &! (strcmp(sobj1, " empty")))

return " put_box";

 

if(! (strcmp(relname, " is_at")) & &

evil-> dbtest(" is_a", agent, " robot") & &

evil-> dbtest(" is_a", sobj1, " door"))

return " goto_door";

 

if(! (strcmp(relname, " is_at")) & &

evil-> dbtest(" is_a", agent, " box") & &

evil-> dbtest(" is_a", sobj1, " door"))

return " move_box";

 

if(! (strcmp(relname, " is_at")) & &

evil-> dbtest(" is_a", agent, " robot") & &

evil-> dbtest(" is_a", sobj1, " box"))

return " goto_box";

 

if(! (strcmp(relname, " is_at")) & &

evil-> dbtest(" is_a", agent, " box") & &

evil-> dbtest(" is_a", sobj1, " box"))

return " push_box";

 

if(! (strcmp(relname, " is_in")) & &

evil-> dbtest(" is_a", agent, " box") & &

evil-> dbtest(" is_a", sobj1, " room"))

return " push_box_other_room";

 

if(! (strcmp(relname, " is_in")) & &

evil-> dbtest(" is_a", agent, " robot") & &

evil-> dbtest(" is_a", sobj1, " room") & &

! (evil-> dbtest(" connects", 0, evil-> findfact(" is_in", " robot")-> sobj1, sobj1))

)

return " go_far_room";

 

if(! (strcmp(relname, " is_in")) & &

evil-> dbtest(" is_a", agent, " robot") & &

evil-> dbtest(" is_a", sobj1, " room") & &

evil-> dbtest(" connects", 0,

evil-> findfact(" is_in", " robot")-> sobj1,

sobj1))

return " go_other_room";

 

else return " No action expected";

}

 

CRobotPlan * CRobotPlan:: delfactall(char *rel, char *n)

{if(next)

{if(! strcmp(relname, rel) & &! strcmp(agent, n))

return next-> delfactall(rel, n);

else next=next-> delfactall(rel, n);

}

if(! strcmp(relname, rel) & &! strcmp(agent, n)) return NULL;

else return this;

}

 

CRobotPlan* CRobotPlan:: Revers(CRobotPlan *nr)

{CRobotPlan *a=new CRobotPlan;

while(nr-> next)

{a= new CRobotPlan(nr-> relname, nr-> agent, nr-> sobj1, nr-> sobj2, a);

nr=nr-> next;

}

return a;

}

 


 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.