home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / e / e020 / 1.ddi / ZJ.PRO < prev    next >
Encoding:
Text File  |  1989-10-04  |  16.0 KB  |  572 lines

  1. /*
  2.          Copyright (c) 1988
  3.        by Computer center of 
  4.     Shaan xi Mechinical colloge  */
  5. code = 3000
  6. /*
  7.   This is a Diagnostic Directing expert-system 
  8.   for IBM PC XT computer. */
  9.  
  10. DOMAINS
  11.   CONDITIONS = BNO*
  12.   HISTORY = RNO*
  13.   RNO, BNO, FNO = INTEGER
  14.   My,  PART = STRING
  15.   data_file = string
  16.   file = save_file
  17.   slist = string*
  18.  
  19. DATABASE
  20.   rule(RNO,PART,PART,CONDITIONS)
  21.   cond(BNO,STRING)
  22.   data_file(data_file)
  23.   yes(BNO)
  24.   no(BNO)
  25.   fact(FNO,PART,PART)
  26.   result(PART,PART)
  27. include "tdoms.pro"
  28. include "tpreds.pro"
  29. include "menu2.pro"
  30.  
  31. PREDICATES
  32.  
  33. /*Commands*/
  34.   diag
  35.   update
  36.   list
  37.   llist(HISTORY,string)
  38.   load_know
  39.   save_know
  40.   pick_dba(data_file)
  41.   erase
  42.   clear
  43.   proces(integer)
  44.   proce2(integer)
  45.   endd(integer)
  46.   evalans(char)
  47.   read(PART)
  48.   run
  49.   reverse(CONDITIONS,CONDITIONS)
  50.   reverse1(CONDITIONS,CONDITIONS,CONDITIONS)
  51.  
  52. /*Inferences mechanisms*/
  53.   go(HISTORY,PART)
  54.   check(RNO,HISTORY,CONDITIONS)
  55.   notest(BNO)
  56.   inpq(HISTORY,RNO,BNO,STRING)
  57.   do_answer(HISTORY,RNO,STRING,BNO,INTEGER)
  58.  
  59. /*Explanations*/
  60.   sub_cat(PART,PART,PART)
  61.   show_conditions(CONDITIONS,string)
  62.   show_rule(RNO,string)
  63.   show_cond(BNO,string)
  64.   report(HISTORY,string)
  65.   quest(PART,integer,integer,PART)
  66.  
  67. /*Update the knowledge*/
  68.   getrnr(RNO,RNO)
  69.   getbnr(BNO,BNO)
  70.   readcondl( CONDITIONS )
  71.   help
  72.   getcond(BNO,STRING)
  73. /*menu */
  74. bootmenu
  75. beepmenu
  76. runmenu
  77. hdiskmenu
  78. sdiskmenu
  79. showmenu
  80. keydmenu
  81. prnmenu
  82. proboot(integer)
  83. probeep(integer)
  84. prorun(integer)
  85. prohdisk(integer)
  86. prosdisk(integer)
  87. proshow(integer)
  88. prokeyd(integer)
  89. proprn(integer)
  90.  
  91. GOAL
  92.   makewindow(1,49,72,"",4,0,20,80),
  93.   makewindow(2,3,7,"",14,0,10,80),
  94.   makewindow(5,7,0,"",0,0,4,80),
  95.   makewindow(8,13,0,"",24,0,1,80),
  96.   makewindow(9,7,0,"",0,0,25,80),
  97.   run.
  98.  
  99. clauses
  100.  run :-
  101.   repeat,
  102.   shiftwindow(8),
  103.   clearwindow,
  104.   write("  select option with arrow key  "),
  105.   shiftwindow(1),
  106.   menu(6,55,10,7,
  107.     ["Diagnostic",
  108.     "Load knowledge",
  109.     "Save knowledge",
  110.     "List knowledge",
  111.     "Update knowledge",
  112.     "Erase knowledge",
  113.     "Edit Knowledge",
  114.     "Help Information",
  115.     "DOS Shell",
  116.     "Exit System"],"menu",2,
  117.     CHOICE),
  118.     proces(CHOICE),
  119. endd(CHOICE),!.
  120.  
  121. /*Process Choice*/
  122.  
  123.  proces(0):-exit.
  124.  proces(1):-diag.
  125.  proces(2):-load_know.
  126.  proces(3):-save_know.
  127.  proces(4):-list.
  128.  proces(5):-update.
  129.  proces(6):-erase.
  130.  proces(7):-system("edkb").
  131.  proces(8):-help.
  132.  proces(9):-system("").
  133.  proces(10).
  134.  
  135.  endd(0).
  136.  endd(10):- clearwindow,
  137.     write("Are you sure? (y or n) "),
  138.     readchar(C),write(C),
  139.     C='y',exit.
  140.  
  141. /*Inference mechanism*/
  142.  
  143.   diag:-
  144.     read(_).
  145.   diag:- nl,
  146.     write("Sorry that one I did not know"),nl,text,update.
  147.  
  148.   read(_):-
  149.        clear,graphics(2,1,10),nl,
  150.        repeat,
  151.        write("      ╒∩╢╧╬╩╠Γ╗∙▒╛▓╦╡Ñ:"),nl,nl,
  152.        write("1) ╞⌠╢»╬╩╠Γ          2) ╘╦╨╨╬╩╠Γ"),nl,
  153.        write("3) ╙▓┼╠╬╩╠Γ          4) ╚φ┼╠╬╩╠Γ"),nl,
  154.        write("5) ╧╘╩╛╬╩╠Γ          6) ╝ⁿ┼╠╬╩╠Γ"),nl,
  155.        write("7) ┤≥╙í╗·╬╩╠Γ        8) ═╦│÷"),nl,nl,
  156.        write("╟δ╩Σ╚δ─π╡─╤í╘± (1--8) "),
  157.        readint(Dm),
  158.        Dm<9,proce2(Dm),Dm>=8,!.
  159.  
  160.  proce2(1):-bootmenu,!.
  161.  proce2(2):-runmenu,!.
  162.  proce2(3):-hdiskmenu,!.
  163.  proce2(4):-sdiskmenu,!.
  164.  proce2(5):-showmenu,!.
  165.  proce2(6):-keydmenu,!.
  166.  proce2(7):-prnmenu,!.
  167.  proce2(8):-text,run,!.
  168.  
  169. bootmenu:-
  170.               graphics(2,1,3),nl,nl,
  171.               write("        ╞⌠╢»╬╩╠Γ└α╨═:"),nl,
  172.               write("1)╞⌠╢»╩▒│÷╧╓╧╡═│┤φ( POST ╩º░▄)"),nl,
  173.               write("2)╡τ╘┤╡╞▓╗┴┴,╞┴─╗▓╗╧╘╩╛ ,┼╠▓╗╣ñ╫≈"),nl,
  174.               write("3)╡τ╘┤╡╞┴┴,╞┴─╗╞┴─╗╬▐╚╬║╬╧╘╩╛,┼╠▓╗╣ñ╫≈"),nl,
  175.               write("4)  POST ╒²│ú,╡½▓╗─▄╞⌠╢»"),nl,nl,
  176.               write("    ╟δ╩Σ╚δ─π╡─╤í╘± (1-4):"),nl,
  177.               write("    ╗≥╩Σ╚δ 5 ═╦│÷╞⌠╢»╬╩╠Γ╒∩╢╧   "),nl,nl,
  178.               readint(Replyboot),nl,
  179.               proboot(Replyboot),Replyboot>=5,!.
  180.  proboot(1):-beepmenu.
  181.  proboot(2):-go([],power_computer),!.
  182.  proboot(3):-go([],clock),!.
  183.  proboot(4):-go([],boot_4),!.
  184.  proboot(5):-text,read(_),!.
  185.  /*.........*/
  186.  beepmenu:-
  187.              clearwindow,
  188.              graphics(2,0,14),
  189.              write("   │⌡╩╝╒∩╢╧╩▒╡─╜╨╔∙└α╨═:"),nl,
  190.              write("1) ╬▐╜╨╔∙,╗·╞≈╬▐╖┤╙ª"),nl,  
  191.              write("2) ╥╗╔∙╢╠╜╨,┤┼┼╠╡╞┴┴"),nl,
  192.              write("3) ┴¼╨°╜╨ "),nl,      
  193.              write("4)╥╗╔∙│ñ╜╨,╥╗╔∙╢╠╜╨"),nl,
  194.              write("5)╥╗╔∙│ñ╜╨,┴╜╔∙╢╠╜╨"),nl,
  195.              write("6)╥╗╔∙╢╠╜╨,╞┴─╗▒Σ║┌╗≥╧╘╩╛▓╗╒²│ú"),nl,
  196.              write("7) ╓╪╕┤╡─╢╠╜╨╔∙"),nl,
  197.              write("8)╥╗╔∙╢╠╜╨,╝┤│÷╧╓ BASIC ╠ß╩╛╖√"),nl,nl,
  198.              write("  ╟δ╩Σ╚δ─π╡─╤í╘± (1-8):"),nl,
  199.              write("  ╗≥╩Σ╚δ 9 ═╦│÷╜╨╔∙╒∩╢╧   "),nl,nl,
  200.              readint(Replybeep),
  201.               probeep(Replybeep),Replybeep=9,!.
  202. probeep(1):-go([],power_computer),!.
  203. probeep(2):-go([],disk),!.
  204. probeep(3):-go([],power_computer),!.
  205. probeep(4):-go([],system_board),!.
  206. probeep(5):-go([],crt_circut),!.
  207. probeep(6):-go([],crt_circut),!.
  208. probeep(7):-go([],system_board),!.
  209. probeep(8):-go([],disk),!.
  210. probeep(9):-!. 
  211. /* run   menu */
  212. runmenu:-
  213.        graphics(2,1,3),
  214.        write("       ╘╦╨╨╬╩╠Γ└α╨═:"),nl,nl,
  215.        write("1) ╝╞╦π╗·╦└╦°,╡½╡τ╘┤╚╘╘┌╣ñ╫≈"),nl,
  216.        write("2) ╝╞╦π╗·╡⌠╡τ,╫╘╝║╣╪╢╧╡τ╘┤"),nl,
  217.        write("3) ╞µ┼╝╨ú╤Θ┤φ "),nl,
  218.        write("4) ╜╙╔╧═Γ▓┐╔Φ▒╕╩▒╝╞╦π╗·╧╡═│▒└└ú"),nl,
  219.        write("5) ╣²╚╚"),nl,
  220.        write("6) ═╦│÷"),nl,nl,
  221.        write(" ╟δ╩Σ╚δ─π╡─╤í╘±(0-6)"),
  222.        readint(Replyrun),
  223.        prorun(Replyrun),
  224.        Replyrun>=6,!.
  225.        
  226.  /*    run proces  */
  227.  prorun(1):-go([],run_1),!.
  228.  prorun(2):-go([],run_2),!.
  229.  prorun(3):-go([],run_3),!.
  230.  prorun(4):-go([],run_4),!.
  231.  prorun(5):-go([],run_5),!.
  232.  prorun(6):-!.
  233.  /*     hard disk  */
  234.  hdiskmenu:-
  235.        graphics(2,0,19),
  236.          write("        ╙▓┼╠╓ó╫┤└α╨═:"),nl,
  237.          write("1) ╙▓┼╠▓╗╢»--╖├╬╩╩▒╫░╚δ╡╞▓╗┴┴"),nl,
  238.          write("2) ╢┴╨┤▓╗═Ω╒√ "),nl,
  239.          write("3) ╢┴╒²╚╖,╡½╨┤▓╗╒²╚╖ "),nl,
  240.          write("4) ╘╦╨╨ CHKDSK ╩▒│÷┤φ "),nl,
  241.          write("5) ╧∞╔∙╥∞│ú "),nl,
  242.          write("6) ╢¬╡⌠┴╦╦∙┤µ╨┼╧ó "),nl,
  243.          write("7) ═╦│÷"),nl,nl,
  244.          write("╟δ╩Σ╚δ─π╡─╤í╘±(1-7)"),
  245.          readint(Replyhdisk),
  246.          prohdisk(Replyhdisk),
  247.          Replyhdisk>=7,!.
  248.    prohdisk(1):-go([],hdisk_1),!.
  249.    prohdisk(2):-go([],hdisk_2),!.
  250.    prohdisk(3):-go([],hdisk_3),!.
  251.    prohdisk(4):-go([],hdisk_4),!.
  252.    prohdisk(5):-go([],hdisk_5),!.
  253.    prohdisk(6):-go([],hdisk_6),!.
  254.    prohdisk(7):-!.       
  255.       /*   soft disk */
  256.  sdiskmenu:-
  257.          graphics(2,1,15),
  258.          write("         ╚φ┼╠╓ó╫┤└α╨═:"),nl,
  259.          write("1) ╚φ┼╠▓╗╢»--╖├╬╩╩▒╫░╚δ╡╞▓╗┴┴"),nl,
  260.          write("2) ╧╘╩╛ Not ready reading drive x ,Abort,Retry,Ignore?"),nl,
  261.          write("3) ╢┴╨┤▓╗═Ω╒√ "),nl,
  262.          write("4) ╢┴╒²╚╖,╡½╨┤▓╗╒²╚╖ "),nl,
  263.          write("5) ╧∞╔∙╥∞│ú "),nl,
  264.          write("6) ╫░╚δ,╨╢╧┬┼╠╞¼▒╚╜╧└º─╤ "),nl,
  265.          write("7) ═╦│÷"),nl,nl,
  266.          write("╟δ╩Σ╚δ─π╡─╤í╘±(1-7)"),
  267.          readint(Replysdisk),
  268.          prosdisk(Replysdisk),
  269.          Replysdisk>=7,!.
  270.    prosdisk(1):-go([],sdisk_1),!.
  271.    prosdisk(2):-go([],sdisk_2),!.
  272.    prosdisk(3):-go([],sdisk_3),!.
  273.    prosdisk(4):-go([],sdisk_4),!.
  274.    prosdisk(5):-go([],sdisk_5),!.
  275.    prosdisk(6):-go([],sdisk_6),!.
  276.    prosdisk(7):-!.
  277. /*  display    (show)  */
  278.          showmenu:-
  279.          graphics(2,1,10),
  280.          write("╧╘╩╛╬╩╠Γ└α╨═"),nl,nl,
  281.          write("1) ╬▐╧╘╩╛"),nl,
  282.          write("2) ╧╘╩╛╡¡─«"),nl,
  283.          write("3) ╧╘╩╛╞≈╣²╚╚"),nl,
  284.          write("4) ┤╣╓▒═¼▓╜╩º╡≈"),nl,
  285.          write("5) ╦«╞╜═¼▓╜╩º╡≈"),nl,
  286.          write("6) ╧╘╩╛╨┼╧ó╘╙┬╥"),nl,
  287.          write("7) ▓╩╔½╧╘╩╛╞≈╗╡╗≥╬▐▓╩╔½"),nl,
  288.          write("8) ╫╓╖√╧╘╩╛▓╗┴╝ "),nl,
  289.          write("9) ═╦│÷"),nl,nl,
  290.          write("      ╟δ╩Σ╚δ─π╡─╤í╘±(1-9)"),
  291.          readint(Replyshow),
  292.          proshow(Replyshow),
  293.          Replyshow>=9,!.
  294.       
  295.       proshow(1):-go([],no_display),!.
  296.       proshow(2):-go([],show_fade),!.
  297.       proshow(3):-go([],crt_overheating),!.
  298.       proshow(4):-go([],v_nosyn),!.
  299.       proshow(5):-go([],h_nosyn),!.
  300.       proshow(6):-go([],show_gabage),!.
  301.       proshow(7):-go([],no_color),!.
  302.       proshow(8):-go([],char_show_bad),!.
  303.       proshow(9):-!.
  304.       
  305. /* keyboard     (keyd)  */       
  306.     keydmenu:-
  307.           graphics(2,0,11),    
  308.         write("╝╠╨°╒∩╢╧╟░╙ª╚╖▒ú╝ⁿ┼╠╬▐╬∩└φ╦≡╔╦"),nl,
  309.         write("    ╝ⁿ┼╠╬╩╠Γ└α╨═:"),nl,nl,
  310.         write("1) ╝ⁿ┼╠╩º┴Θ"),nl,
  311.         write("2) ╝ⁿ┼╠╦°╢¿╘┌╔╧╡╡╗≥╧┬╡╡"),nl,
  312.         write("3) ╥╗╕÷╗≥╢α╕÷╝ⁿ▓╗╣ñ╫≈"),nl,
  313.         write("4) ═╦│÷"),nl,nl,
  314.         write("    ╟δ╩Σ╚δ─π╡─╤í╘±(1-4)"),
  315.         readint(Replykeyd),
  316.         prokeyd(Replykeyd),
  317.         Replykeyd>=4,!.
  318.        prokeyd(1):-go([],keyd_1),!.
  319.        prokeyd(2):-go([],keyd_2),!.
  320.        prokeyd(3):-go([],keyd_3),!.
  321.        prokeyd(4):-!.
  322.        /* printer (prn)  */      
  323.    prnmenu:-
  324.         graphics(2,0,2),
  325.          write("    ┤≥╙í╗·╬╩╠Γ└α╨═:"),nl,nl,
  326.          write("0)  ═╦│÷"),nl,
  327.          write("1)  ┤≥╙í╗·╩º┴Θ"),nl,
  328.          write("2)  ▓╗─▄╫╘╝∞"),nl,
  329.          write("3)  ╫╘╝∞╒²│ú,┴¬╗·╩º░▄"),nl,
  330.          write("4)  ┤≥╙í╨┼╧ó╘╙┬╥"),nl,
  331.          write("5)  │÷╧╓╥∞│ú╡─┼╝╚╗╡─┤φ╬≤"),nl,
  332.          write("6)  ═╗╚╗═ú╓╣┤≥╙í"),nl,
  333.          write("7)  ┤≥╙í═╖╨í│╡▓╗─▄╥╞╢»"),nl,
  334.          write("8)  ┤≥╙í╘┌╣ñ╫≈,╡½┤≥╙í▓╗│÷╚╬║╬╫╓╖√"),nl,
  335.          write("9)  ┤≥╙í╗·╗≥┤≥╙í═╖╣²╚╚"),nl,
  336.          write("10)  ╙í│÷╡─╫╓╖√╝Σ╛α▓╗╛∙╘╚"),nl,
  337.          write("11)  ╢¬╡⌠▓┐╖╓┤≥╙í╫╓╖√"),nl,
  338.          write("12)  ┤≥╙í╓╜╙╡╝╖│╔╢╤"),nl,nl,
  339.          write("     ╟δ╩Σ╚δ─π╡─╤í╘±(0-12)"),
  340.          readint(Replyprn),
  341.          proprn(Replyprn),
  342.          Replyprn=0,!.
  343.    
  344.         proprn(0):-!.
  345.         proprn(1):-go([],printer_1),!.
  346.         proprn(2):-go([],printer_2),!.
  347.         proprn(3):-go([],printer_3),!.
  348.         proprn(4):-go([],printer_4),!.
  349.         proprn(5):-go([],printer_5),!.
  350.         proprn(6):-go([],printer_6),!.
  351.         proprn(7):-go([],printer_7),!.
  352.         proprn(8):-go([],printer_8),!.
  353.         proprn(9):-go([],printer_9),!.
  354.         proprn(10):-go([],printer_10),!.
  355.         proprn(11):-go([],printer_11),!.
  356.         proprn(12):-go([],printer_12),!.
  357.     /*   resoning  mechine  */
  358.   
  359.   go( _, Mygoal ):-                     /* My best guess  */
  360.     not(rule(_,Mygoal,_,_)),!,nl,
  361.     result(Mygoal,Xr),nl,nl,
  362.     write(Xr),nl,nl,
  363.     clear,
  364.     write("╜ß┬█╒²╚╖┬≡?╟δ╝ⁿ╚δ─π╡─╗╪┤≡(y/n)"),
  365.     readchar(Ans),
  366.     evalans(Ans),graphics(2,0,10),!.
  367.  
  368.  go( HISTORY, Mygoal ):-
  369.     rule(RNO,Mygoal,NY,COND),
  370.     check(RNO,HISTORY, COND),
  371.     go([RNO|HISTORY],NY).
  372.  
  373.   check( RNO, HISTORY, [BNO|REST] ):- yes(BNO), !,
  374.     check(RNO, HISTORY, REST).
  375.   check( _, _, [BNO|_] ):- no(BNO), !,fail.
  376.   check( RNO, HISTORY, [BNO|REST] ):- cond(BNO,NCOND),
  377.     fronttoken(NCOND,"not",_COND),
  378.     frontchar(_COND,_,COND),
  379.     cond(BNO1,COND),
  380.     notest(BNO1), !,
  381.     check(RNO, HISTORY, REST).
  382.   check(_,_, [BNO|_] ):- cond(BNO,NCOND),
  383.     fronttoken(NCOND,"not",_COND),
  384.     frontchar(_COND,_,COND),
  385.     cond(BNO1,COND),
  386.     yes(BNO1), !,fail.
  387.   check( RNO, HISTORY, [BNO|REST] ):-
  388.     cond(BNO,TEXT),
  389.     inpq(HISTORY,RNO,BNO,TEXT),
  390.     check(RNO, HISTORY, REST).
  391.     check( _, _, [] ).
  392.  
  393.   notest(BNO):-no(BNO),!.
  394.   notest(BNO):-not(yes(BNO)),!.
  395.  
  396.   inpq(HISTORY,RNO,BNO,TEXT):-
  397.      graphics(1,0,10),
  398.     write("╬╩╠Γ:\n ",TEXT,"┬≡ ? "),nl,nl,nl,
  399.     write(" ╟δ╥╞╣Γ▒Ω╝ⁿ╗╪┤≡  "),nl,
  400.     ROW = 0,
  401.     COL = 30,
  402.     menu(ROW,COL,9,0,["╩╟","╖±","╜Γ╩═╬¬╩▓├┤"],"",1,CHOICE), 
  403.     do_answer(HISTORY,RNO,TEXT,BNO,CHOICE).
  404.   do_answer(_,_,_,_,0):-exit.
  405.   do_answer(_,_,_,BNO,1):-assert(yes(BNO)),
  406.     shiftwindow(1),write(yes),nl.
  407.   do_answer(_,_,_,BNO,2):-assert(no(BNO)),
  408.     shiftwindow(1),write(no),nl,fail.
  409.   do_answer(HISTORY,RNO,TEXT,BNO,3):- !,
  410.     shiftwindow(2),
  411.     rule( RNO, Mygoal1, Mygoal2, _ ),
  412.     sub_cat(Mygoal1,Mygoal2,Lstr),
  413.     concat("I try to show that: ",Lstr,Lstr1),
  414.     concat(Lstr1,"\nBy using rule number ",Ls1),
  415.     str_int(Str_num,RNO),
  416.     concat(Ls1,Str_num,Ans),
  417.     show_rule(RNO,Lls1),
  418.     concat(Ans,Lls1,Ans1),
  419.     report(HISTORY,Sng),
  420.     concat(Ans1,Sng,Answ),
  421.     display(Answ),
  422.     shiftwindow(8),
  423.     clearwindow,
  424.     write(" ╟δ╥╞╣Γ▒Ω╝ⁿ╗╪┤≡  "),nl,
  425.     shiftwindow(1),
  426.     ROW=4,COL=30,
  427.     menu(ROW,COL,95,0,["╩╟","╖±","╜Γ╩═╬¬╩▓├┤"],"",1,CHOICE), 
  428.     do_answer(HISTORY,RNO,TEXT,BNO,CHOICE).
  429.  
  430. /* List Rules / Explanation Mechanism */
  431.  
  432.   list :- findall(RNO,rule(RNO,_,_,_),LIST),
  433.     llist(List,Str),!,graphics(1,0,23),display(Str),!.
  434.  
  435.   llist([],"") :-!.
  436.   llist([RNO|List],Str):-
  437.     llist(List,Oldstr),
  438.     show_rule(RNO,RNO_Str),
  439.     concat(RNO_Str,Oldstr,Str).
  440.  
  441.   show_rule(RNO,Strg):-
  442.     rule( RNO, Mygoal1, Mygoal2, CONDINGELSER),
  443.     str_int(RNO_str,RNO),
  444.     concat("\n Rule ",RNO_str,Ans),
  445.     concat(Ans,": ",Ans1),
  446.     sub_cat(Mygoal1,Mygoal2,Lstr),
  447.     concat(Ans1,Lstr,Ans2),
  448.     concat(Ans2,"\n     if ",Ans3),
  449.     reverse(CONDINGELSER,CONILS),
  450.     show_conditions(CONILS,Con),
  451.     concat(Ans3,Con,Strg).
  452.  
  453.   show_conditions([],"").
  454.   show_conditions([COND],Ans):-
  455.     show_cond(COND,Ans),!.
  456.   show_conditions([COND|REST],Ans):-
  457.     show_cond(COND,Text),
  458.     concat("\n    and ",Text,Nstr),
  459.     show_conditions(REST,Next_ans),
  460.     concat(Next_ans,Nstr,Ans).
  461.  
  462.   show_cond(COND,TEXT):-cond(COND,TEXT).
  463.  
  464.   sub_cat(Mygoal1,Mygoal2,Lstr):-
  465.     concat(Mygoal1," is a ",Str),
  466.     concat(Str,Mygoal2,Lstr).
  467.  
  468.   report([],"").
  469.   report([RNO|REST],Strg) :-
  470.     rule( RNO, Mygoal1, Mygoal2, _),
  471.     sub_cat(Mygoal1,Mygoal2,Lstr),
  472.     concat("\n ╬¬─π╧╘╩╛: ",Lstr,L1),
  473.     concat(L1,"\n═¿╣²╩╣╙├╣µ╘≥ : ",L2),
  474.     str_int(Str_RNO,RNO),
  475.     concat(L2,Str_RNO,L3),
  476.     concat(L3,":\n ",L4),
  477.     show_rule(RNO,Str),
  478.     concat(L4,Str,L5),
  479.     report(REST,Next_strg),
  480.     concat(L5,Next_strg,Strg).
  481.  
  482. /*Update the knowledge base*/
  483.  
  484.   getrnr(N,N):-not(rule(N,_,_,_)),!.
  485.   getrnr(N,N1):-H=N+1,getrnr(H,N1).
  486.  
  487.   getbnr(N,N):-not(cond(N,_)),!.
  488.   getbnr(N,N1):-H=N+1,getbnr(H,N1).
  489.  
  490.   readcondl( [BNO|R] ):-
  491.     write("condition: "),readln(COND),
  492.     COND><"",!,
  493.     getcond(BNO,COND),
  494.     readcondl( R ).
  495.   readcondl( [] ).
  496.  
  497.   getcond(BNO,COND):-cond(BNO,COND),!.
  498.   getcond(BNO,COND):-getbnr(1,BNO), assert( cond(BNO,COND) ).
  499.  
  500.  
  501. /*HELP !!!*/
  502.  
  503.    help :- file_str("geni.hlp",Help),
  504.     display(Help).
  505.  
  506. /*User commands*/
  507.  
  508.   load_know:-pick_dba(Data), consult(Data).
  509.  
  510.   save_know :- data_file(Data), bound(Data),!,
  511.     save(Data),clearwindow,
  512.     writef(" Your % Knowledge base has been saved",Data).
  513.   save_know :- makewindow(11,10,9,"Name of the file",10,40,4,35),
  514.     write("Enter Knowledge\nBase Name: "),
  515.     readln(Data),
  516.     assert(data_file(Data)),
  517.     removewindow,
  518.     save(Data),clearwindow,
  519.     writef(" Your % Knowledge base has been saved",Data).
  520.  
  521.   pick_dba(Data) :- makewindow(10,7,7,"PICK A DATA FILE",10,10,10,60),
  522.     dir("","*.kb",Data),removewindow.
  523.  
  524.   erase:-retract(_),fail.
  525.   erase.
  526.  
  527.   clear:-retract(yes(_)),retract(no(_)),fail,!.
  528.   clear.
  529.  
  530.   update:-
  531.     shiftwindow(5),
  532.     clearwindow,
  533.     write("\n\tUpdate knowledge\n\t****************\n"),
  534.     cursor(1,30),
  535.     write("Name of category: "),
  536.     cursor(3,30),
  537.     write("Name of subcategory: "),
  538.     cursor(1,50),
  539.     readln(KAT1),KAT1><"",
  540.     quest(KAT1,1,50,KAT),
  541.     cursor(3,50),
  542.     readln(SUB1),SUB1><"",
  543.     quest(SUB1,3,50,SUB),
  544.     readcondl(CONDL),
  545.     getrnr(1,RNO),
  546.     assert( rule(RNO,KAT,SUB,CONDL) ),update.
  547.  
  548.   quest(Q,X,Y,Q2):- Q = "?",
  549.     shiftwindow(2),clearwindow,
  550.     write("The categories and subcategories are objects. For example:\n"),nl,
  551.     write("subcategory|-----| category|-----|[condition1  |------|  condition2]\n"),
  552.     write("___________|_____|_______________|_____________|______|____________"),nl,
  553.     write("mammal     |is an| animal  |if it| has hair    |and it|  gives milk\n"),
  554.     write("bird       |is an| animal  |if it| has feathers|and it|  lays eggs\n"),
  555.     shiftwindow(5),
  556.     cursor(X,Y),
  557.     readln(Q2).
  558.   quest(Q,_,_,Q).
  559.  
  560.   evalans('y'):-
  561.     write("\nOf course, I am always right!"),!.
  562.   evalans(_):-
  563.     write(" you're the boss \n  Update my Knowledge Base!"),!,run.
  564.  
  565.  /*system commands*/
  566.  
  567.   reverse(X,Y):-
  568.      reverse1([],X,Y).
  569.   reverse1(Y,[],Y).
  570.   reverse1(X1,[U|X2],Y):-reverse1([U|X1],X2,Y).
  571.  
  572.