------------------------------------------------------------------------
-- Actor Prolog, (c) 2003, IRE RAS Alexei A. Morozov --
------------------------------------------------------------------------
-- This program is an example of visual component-oriented --
-- programming in Actor Prolog. The program consists only of an SADT --
-- diagram in the IDL format. The source text components written in --
-- Actor Prolog are connected to the program automatically in --
-- accordance with the names of blocks of the SADT diagram and --
-- the #package options included in the notes of the blocks of the --
-- diagram. Actor Prolog translates the diagram into the logic --
-- program and executes it. --
------------------------------------------------------------------------
package "E:\\A_PROLOG\\EXAMPLES\\WEB\\COMPLEX":
import '_ENTER_REQUEST'
from "E:\A_PROLOG\MOROZOV\WEB\ENGINES\REQUEST";
import '_CONVERT_MESSAGE_"SEARCH"_TO_"SHOW"_AND_"SEARCH"'
from "E:\A_PROLOG\MOROZOV\LINKS\MANIFOLD";
import '_BROWSE_LIST'
from "E:\A_PROLOG\MOROZOV\WEB\BROWSING\LIST";
import '_CONTROL_ENGINE'
from "E:\A_PROLOG\MOROZOV\WEB\ENGINES\CONTROL";
import '_CONSULT_RAMBLER'
from "E:\A_PROLOG\MOROZOV\WEB\ENGINES\RAMBLER";
import '_CONSULT_GOOGLE'
from "E:\A_PROLOG\MOROZOV\WEB\ENGINES\GOOGLE";
import '_MERGE_TWO_LISTS'
from "E:\A_PROLOG\MOROZOV\LINKS\MERGE";
import '_CHECK_RESOURCES'
from "E:\A_PROLOG\MOROZOV\WEB\FILTERS\CHECK";
import '_FILTER_LIST'
from "E:\A_PROLOG\MOROZOV\WEB\FILTERS\ENGINE";
project:
(('MODEL',
project_name = "Complex Search",
creation_date = "26/7/2002",
title = "Use Two Search Engines and "
"Preliminary Filtering",
language_version = "1.2.8"))
------------------------------------------------------------------------
class 'MODEL' specializing 'ALPHA':
box = (('DIAGRAM-ROOT',
model = model,
container = self));
model = self;
project_name = "Complex Search";
[
]
------------------------------------------------------------------------
class 'DIAGRAM-ROOT' specializing 'A-0':
box_0 = (('DIAGRAM-A0',
container = self,
model = model));
status = "PUBLICATION";
revision_date = "27/7/2002";
creation_date = "27/7/2002";
author = "Alexei A. Morozov";
title = "A-0";
name = "A-0";
number = 'root';
model;
x = 7.0;
y = 22.0;
container;
con = ('REPORT',
title = "A-0",
x = x,
y = y,
width = 37,
height = 9);
[
]
------------------------------------------------------------------------
class 'A-0' specializing 'COMPOUND_BLOCK':
box_0;
title;
name;
number;
model;
x;
y;
container;
con;
[
]
------------------------------------------------------------------------
class 'DIAGRAM-A0'
specializing 'USE_TWO_SEARCH_ENGINES_AND_PRELIMINARY_FILTERING':
variable:
link_1;
link_2;
link_3;
link_4;
link_5;
constant:
box_1 = (('DIAGRAM-A1',
constant:
container = self,
model = model,
entry_o1 = ('ARROW',
constant:
host = self,
entry = "1o1",
variable:
value = link_5),
variable:
value_o1 = link_5,
constant:
entry_o2 = ('ARROW',
constant:
host = self,
entry = "1o2",
variable:
value = link_3),
variable:
value_o2 = link_3));
box_2 = (('DIAGRAM-A2',
constant:
container = self,
model = model,
entry_i1 = ('ARROW',
constant:
host = self,
entry = "2i1",
variable:
value = link_5),
variable:
value_i1 = link_5,
constant:
entry_o1 = ('ARROW',
constant:
host = self,
entry = "2o1",
variable:
value = link_1),
variable:
value_o1 = link_1,
constant:
entry_o2 = ('ARROW',
constant:
host = self,
entry = "2o2",
variable:
value = link_4),
variable:
value_o2 = link_4));
box_3 = (('DIAGRAM-A3',
constant:
container = self,
model = model,
entry_i2 = ('ARROW',
constant:
host = self,
entry = "3i2",
variable:
value = link_3),
variable:
value_i2 = link_3,
constant:
entry_i1 = ('ARROW',
constant:
host = self,
entry = "3i1",
variable:
value = link_4),
variable:
value_i1 = link_4,
constant:
entry_o1 = ('ARROW',
constant:
host = self,
entry = "3o1",
variable:
value = link_2),
variable:
value_o1 = link_2));
box_4 = (('DIAGRAM-A4',
constant:
container = self,
model = model,
entry_c1 = ('ARROW',
constant:
host = self,
entry = "4c1",
variable:
value = link_1),
variable:
value_c1 = link_1,
constant:
entry_i1 = ('ARROW',
constant:
host = self,
entry = "4i1",
variable:
value = link_2),
variable:
value_i1 = link_2));
status = "PUBLICATION";
revision_date = "27/7/2002";
creation_date = "27/7/2002";
author = "Alexei A. Morozov";
title = "A0: Use Two Search Engines and Preliminary Filtering";
name = "Use Two Search Engines and Preliminary Filtering";
number = 0;
model;
x = 25.64498;
y = 14.82936;
container;
con = ('REPORT',
title = "A0: USE_TWO_SEARCH_ENGINES_AND_"
"PRELIMINARY_FILTERING",
x = x,
y = y,
width = 37,
height = 9);
[
component(box_1).
component(box_2).
component(box_3).
component(box_4):-!.
"1o1"{|REST}:-!,
box_2 << "i1"{|REST}.
"2i1"{|REST}:-!,
box_1 << "o1"{|REST}.
"1o2"{|REST}:-!,
box_3 << "i2"{|REST}.
"3i2"{|REST}:-!,
box_1 << "o2"{|REST}.
"2o1"{|REST}:-!,
box_4 << "c1"{|REST}.
"4c1"{|REST}:-!,
box_2 << "o1"{|REST}.
"2o2"{|REST}:-!,
box_3 << "i1"{|REST}.
"3i1"{|REST}:-!,
box_2 << "o2"{|REST}.
"3o1"{|REST}:-!,
box_4 << "i1"{|REST}.
"4i1"{|REST}:-!,
box_3 << "o1"{|REST}.
P("1o1",REST*):-!,
box_2 << P("i1",REST*).
P("2i1",REST*):-!,
box_1 << P("o1",REST*).
P("1o2",REST*):-!,
box_3 << P("i2",REST*).
P("3i2",REST*):-!,
box_1 << P("o2",REST*).
P("2o1",REST*):-!,
box_4 << P("c1",REST*).
P("4c1",REST*):-!,
box_2 << P("o1",REST*).
P("2o2",REST*):-!,
box_3 << P("i1",REST*).
P("3i1",REST*):-!,
box_2 << P("o2",REST*).
P("3o1",REST*):-!,
box_4 << P("i1",REST*).
P("4i1",REST*):-!,
box_3 << P("o1",REST*).
]
------------------------------------------------------------------------
class 'USE_TWO_SEARCH_ENGINES_AND_PRELIMINARY_FILTERING'
specializing 'COMPOUND_BLOCK':
box_1;
box_2;
box_3;
box_4;
title;
name;
number;
model;
x;
y;
container;
con;
[
]
------------------------------------------------------------------------
class 'DIAGRAM-A3' specializing 'COLLECT_DATA':
constant:
entry_i1;
variable:
value_i1;
constant:
entry_i2;
variable:
value_i2;
constant:
entry_o1;
variable:
value_o1;
link_1;
link_2;
link_3;
link_4;
link_5;
constant:
box_1 = (('DIAGRAM-A31',
constant:
container = self,
model = model,
entry_o1 = ('ARROW',
constant:
host = self,
entry = "1o1",
variable:
value = link_5),
variable:
value_o1 = link_5));
box_2 = (('DIAGRAM-A32',
constant:
container = self,
model = model,
entry_i1 = ('ARROW',
constant:
host = self,
entry = "2i1",
variable:
value = value_i1),
variable:
value_i1 = value_i1,
constant:
entry_c1 = ('ARROW',
constant:
host = self,
entry = "2c1",
variable:
value = link_5),
variable:
value_c1 = link_5,
constant:
entry_o1 = ('ARROW',
constant:
host = self,
entry = "2o1",
variable:
value = link_3),
variable:
value_o1 = link_3));
box_3 = (('DIAGRAM-A33',
constant:
container = self,
model = model,
entry_c1 = ('ARROW',
constant:
host = self,
entry = "3c1",
variable:
value = link_5),
variable:
value_c1 = link_5,
constant:
entry_i1 = ('ARROW',
constant:
host = self,
entry = "3i1",
variable:
value = value_i1),
variable:
value_i1 = value_i1,
constant:
entry_o1 = ('ARROW',
constant:
host = self,
entry = "3o1",
variable:
value = link_4),
variable:
value_o1 = link_4));
box_4 = (('DIAGRAM-A34',
constant:
container = self,
model = model,
entry_i1 = ('ARROW',
constant:
host = self,
entry = "4i1",
variable:
value = link_3),
variable:
value_i1 = link_3,
constant:
entry_i2 = ('ARROW',
constant:
host = self,
entry = "4i2",
variable:
value = link_4),
variable:
value_i2 = link_4,
constant:
entry_o1 = ('ARROW',
constant:
host = self,
entry = "4o1",
variable:
value = link_1),
variable:
value_o1 = link_1));
box_5 = (('DIAGRAM-A35',
constant:
container = self,
model = model,
entry_i1 = ('ARROW',
constant:
host = self,
entry = "5i1",
variable:
value = value_i2),
variable:
value_i1 = value_i2,
constant:
entry_o1 = ('ARROW',
constant:
host = self,
entry = "5o1",
variable:
value = link_2),
variable:
value_o1 = link_2));
box_6 = (('DIAGRAM-A36',
constant:
container = self,
model = model,
entry_i1 = ('ARROW',
constant:
host = self,
entry = "6i1",
variable:
value = link_1),
variable:
value_i1 = link_1,
constant:
entry_m1 = ('ARROW',
constant:
host = self,
entry = "6m1",
variable:
value = link_2),
variable:
value_m1 = link_2,
constant:
entry_o1 = ('ARROW',
constant:
host = self,
entry = "6o1",
variable:
value = value_o1),
variable:
value_o1 = value_o1));
status = "PUBLICATION";
revision_date = "28/7/2002";
creation_date = "27/7/2002";
title = "A3: Collect Data";
name = "Collect Data";
number = 3;
model;
x = 44.16574;
y = 17.1708;
container;
con = ('REPORT',
title = "A3: COLLECT_DATA",
x = x,
y = y,
width = 37,
height = 9);
[
component(box_1).
component(box_2).
component(box_3).
component(box_4).
component(box_5).
component(box_6):-!.
"5i1"{|REST}:-!,
entry_i2 ? 'message'{|REST}.
"1o1"{|REST}:-!,
box_3 << "c1"{|REST},
box_2 << "c1"{|REST}.
"2o1"{|REST}:-!,
box_4 << "i1"{|REST}.
"4i1"{|REST}:-!,
box_2 << "o1"{|REST}.
"4o1"{|REST}:-!,
box_6 << "i1"{|REST}.
"6i1"{|REST}:-!,
box_4 << "o1"{|REST}.
"3o1"{|REST}:-!,
box_4 << "i2"{|REST}.
"4i2"{|REST}:-!,
box_3 << "o1"{|REST}.
"6o1"{|REST}:-!,
entry_o1 ? 'message'{|REST}.
"5o1"{|REST}:-!,
box_6 << "m1"{|REST}.
"6m1"{|REST}:-!,
box_5 << "o1"{|REST}.
"3c1"{|REST}:-!,
box_1 << "o1"{|REST}.
"2i1"{|REST}:-!,
entry_i1 ? 'message'{|REST}.
"3i1"{|REST}:-!,
entry_i1 ? 'message'{|REST}.
"2c1"{|REST}:-!,
box_1 << "o1"{|REST}.
"i1"{|REST}:-!,
box_2 << "i1"{|REST},
box_3 << "i1"{|REST}.
"i2"{|REST}:-!,
box_5 << "i1"{|REST}.
"o1"{|REST}:-!,
box_6 << "o1"{|REST}.
P("5i1",REST*):-!,
entry_i2 ? P(REST*).
P("1o1",REST*):-!,
box_3 << P("c1",REST*),
box_2 << P("c1",REST*).
P("2o1",REST*):-!,
box_4 << P("i1",REST*).
P("4i1",REST*):-!,
box_2 << P("o1",REST*).
P("4o1",REST*):-!,
box_6 << P("i1",REST*).
P("6i1",REST*):-!,
box_4 << P("o1",REST*).
P("3o1",REST*):-!,
box_4 << P("i2",REST*).
P("4i2",REST*):-!,
box_3 << P("o1",REST*).
P("6o1",REST*):-!,
entry_o1 ? P(REST*).
P("5o1",REST*):-!,
box_6 << P("m1",REST*).
P("6m1",REST*):-!,
box_5 << P("o1",REST*).
P("3c1",REST*):-!,
box_1 << P("o1",REST*).
P("2i1",REST*):-!,
entry_i1 ? P(REST*).
P("3i1",REST*):-!,
entry_i1 ? P(REST*).
P("2c1",REST*):-!,
box_1 << P("o1",REST*).
P("i1",REST*):-!,
box_2 << P("i1",REST*),
box_3 << P("i1",REST*).
P("i2",REST*):-!,
box_5 << P("i1",REST*).
P("o1",REST*):-!,
box_6 << P("o1",REST*).
]
------------------------------------------------------------------------
class 'COLLECT_DATA' specializing 'COMPOUND_BLOCK':
constant:
entry_i1;
variable:
value_i1;
constant:
entry_i2;
variable:
value_i2;
constant:
entry_o1;
variable:
value_o1;
constant:
box_1;
box_2;
box_3;
box_4;
box_5;
box_6;
title;
name;
number;
model;
x;
y;
container;
con;
[
]
------------------------------------------------------------------------
class 'DIAGRAM-A1' specializing '_ENTER_REQUEST':
constant:
entry_o1;
protecting:
value_o1;
constant:
entry_o2;
protecting:
value_o2;
constant:
title = "A1: Enter Request";
name = "Enter Request";
number = 1;
model;
x = 2.49324;
y = 7.02432;
container;
con = ('REPORT',
title = "A1: ENTER_REQUEST",
x = x,
y = y,
width = 37,
height = 9);
[
]
------------------------------------------------------------------------
class 'DIAGRAM-A2'
specializing '_CONVERT_MESSAGE_"SEARCH"_TO_"SHOW"_AND_"SEARCH"':
constant:
entry_i1;
variable:
value_i1;
constant:
entry_o1;
protecting:
value_o1;
constant:
entry_o2;
protecting:
value_o2;
constant:
title = "A2: Convert Message \"Search\" to "
"\"Show\" and \"Search\"";
name = "Convert Message \"Search\" to \"Show\" and \"Search\"";
number = 2;
model;
x = 22.43916;
y = 11.12184;
container;
con = ('REPORT',
title = "A2: CONVERT_MESSAGE_\"SEARCH\"_TO_"
"\"SHOW\"_AND_\"SEARCH\"",
x = x,
y = y,
width = 37,
height = 9);
[
]
------------------------------------------------------------------------
class 'DIAGRAM-A4' specializing '_BROWSE_LIST':
constant:
entry_c1;
variable:
value_c1;
constant:
entry_i1;
variable:
value_i1;
constant:
title = "A4: Browse List";
name = "Browse List";
number = 4;
model;
x = 62.68729;
y = 21.65856;
container;
con = ('REPORT',
title = "A4: BROWSE_LIST",
x = x,
y = y,
width = 37,
height = 9);
[
]
------------------------------------------------------------------------
class 'DIAGRAM-A31' specializing '_CONTROL_ENGINE':
constant:
entry_o1;
protecting:
value_o1;
constant:
title = "A31: Control Engine";
name = "Control Engine";
number = 1;
model;
x = 5.34277;
y = 4.878;
container;
con = ('REPORT',
title = "A31: CONTROL_ENGINE",
x = x,
y = y,
width = 37,
height = 9);
[
]
------------------------------------------------------------------------
class 'DIAGRAM-A32' specializing '_CONSULT_RAMBLER':
constant:
entry_i1;
variable:
value_i1;
constant:
entry_c1;
variable:
value_c1;
constant:
entry_o1;
protecting:
value_o1;
constant:
title = "A32: Consult Rambler";
name = "Consult Rambler";
number = 2;
model;
x = 18.16526;
y = 9.56088;
container;
con = ('REPORT',
title = "A32: CONSULT_RAMBLER",
x = x,
y = y,
width = 37,
height = 9);
[
]
------------------------------------------------------------------------
class 'DIAGRAM-A33' specializing '_CONSULT_GOOGLE':
constant:
entry_c1;
variable:
value_c1;
constant:
entry_i1;
variable:
value_i1;
constant:
entry_o1;
protecting:
value_o1;
constant:
title = "A33: Consult Google";
name = "Consult Google";
number = 3;
model;
x = 26.00127;
y = 15.60984;
container;
con = ('REPORT',
title = "A33: CONSULT_GOOGLE",
x = x,
y = y,
width = 37,
height = 9);
[
]
------------------------------------------------------------------------
class 'DIAGRAM-A34' specializing '_MERGE_TWO_LISTS':
constant:
entry_i1;
variable:
value_i1;
constant:
entry_i2;
variable:
value_i2;
constant:
entry_o1;
protecting:
value_o1;
constant:
title = "A34: Merge Two Lists";
name = "Merge Two Lists";
number = 4;
model;
x = 43.80945;
y = 15.02448;
container;
con = ('REPORT',
title = "A34: MERGE_TWO_LISTS",
x = x,
y = y,
width = 37,
height = 9);
[
]
------------------------------------------------------------------------
class 'DIAGRAM-A35' specializing '_CHECK_RESOURCES':
constant:
entry_i1;
variable:
value_i1;
constant:
entry_o1;
protecting:
value_o1;
constant:
title = "A35: Check Resources";
name = "Check Resources";
number = 5;
model;
x = 50.93288;
y = 21.0732;
container;
con = ('REPORT',
title = "A35: CHECK_RESOURCES",
x = x,
y = y,
width = 37,
height = 9);
[
]
------------------------------------------------------------------------
class 'DIAGRAM-A36' specializing '_FILTER_LIST':
constant:
entry_i1;
variable:
value_i1;
constant:
entry_m1;
variable:
value_m1;
constant:
entry_o1;
protecting:
value_o1;
constant:
title = "A36: Filter List";
name = "Filter List";
number = 6;
model;
x = 59.48147;
y = 16.58544;
container;
con = ('REPORT',
title = "A36: FILTER_LIST",
x = x,
y = y,
width = 37,
height = 9);
[
]
------------------------------------------------------------------------
class 'ARROW' specializing 'ALPHA':
constant:
host;
entry;
variable:
value;
[
goal:-!.
'link'{|REST}:-!,
value == REST.
'message'{|REST}:-!,
host << {0:entry|REST}.
P(REST*):-
host << P(entry,REST*).
]
------------------------------------------------------------------------
class 'COMPOUND_BLOCK' specializing 'ALPHA': []
------------------------------------------------------------------------
class 'DUMMY':
con = ('CONSOLE');
[
goal.
--
_{sender:NAME|_}:-
con ? writeln("Syntax error: dummy link with ",NAME),
fail.
]
------------------------------------------------------------------------
package "E:\\A_PROLOG\\MOROZOV\\WEB\\ENGINES\\REQUEST":
------------------------------------------------------------------------
class '_ENTER_REQUEST':
entry_o1;
value_o2;
world = ('REQUEST',
engine = entry_o1,
pattern = value_o2);
[
goal:-!.
--
show(_):-!,
world ? show().
]
------------------------------------------------------------------------
class 'REQUEST' specializing 'DIALOG':
constant:
identifier = "Request";
title = "";
variable:
keywords;
constant:
engine = #;
variable:
pattern;
constant:
con = ('CONSOLE');
[
goal:-!,
pattern == keywords.
--
action("start"):-
check_keywords(keywords),!,
engine <- search(keywords),
hide.
action(_):-!.
--
check_keywords(""):-!,
con ? warning("Please enter keywords!"),
fail.
check_keywords(_):-!.
]
------------------------------------------------------------------------
package "E:\\A_PROLOG\\MOROZOV\\LINKS\\MANIFOLD":
------------------------------------------------------------------------
class '_CONVERT_MESSAGE_"SEARCH"_TO_"SHOW"_AND_"SEARCH"':
entry_i1;
entry_o1;
entry_o2;
[
goal:-!.
--
search(_,KEYWORDS):-
entry_o2 << search(KEYWORDS),
entry_o1 << show().
]
------------------------------------------------------------------------
class 'SEARCH_TO_SHOW_AND_SEARCH':
engine = #;
demonstrator = #;
con;
r1 = ('REPORT');
r2 = ('REPORT');
r3 = ('REPORT');
[
goal:-!.
--
search(KEYWORDS):-
engine << search(KEYWORDS),
demonstrator << show().
]
------------------------------------------------------------------------
package "E:\\A_PROLOG\\MOROZOV\\WEB\\BROWSING\\LIST":
------------------------------------------------------------------------
class '_BROWSE_LIST':
value_i1;
world = ('LIST',
list_of_resources = value_i1);
[
goal:-!.
--
show(_*):-!,
world ? show().
]
------------------------------------------------------------------------
class 'LIST' specializing 'DIALOG':
constant:
identifier = "List";
variable:
list_of_resources;
parameters;
constant:
browser = ('APPLICATION',
constant:
location = auto(".html"),
variable:
parameters = parameters,
constant:
flag = 'maximized',
enable_multiple_instances = 'yes');
check = ('CHECKITEM');
[
goal:-!.
--
action("show_resource"):-
[list_of_resources],
check ? check_item(list_of_resources,parameters),!,
browser ? activate().
action(_):-!.
]
------------------------------------------------------------------------
class '_SELECTOR':
value_i1;
value_o1;
entry_o1;
world = ('SELECTOR',
list_of_resources = value_i1,
item = value_o1,
handler = entry_o1);
[
goal:-!.
--
show(_*):-!,
world ? show().
]
------------------------------------------------------------------------
class 'SELECTOR' specializing 'DIALOG':
identifier = "Selector";
list_of_resources;
item;
handler = #;
check = ('CHECKITEM');
[
goal:-!.
--
action("process_resource"):-
[item],
check ? check_item(list_of_resources,item),!,
handler ? process(item),
hide.
action(_):-!.
]
------------------------------------------------------------------------
class '_EDIT':
value_i1;
value_o1;
entry_o1;
world = ('EDIT',
list_of_resources = value_i1,
item = value_o1,
handler = entry_o1);
[
goal:-!.
--
show(_*):-!,
world ? show().
]
------------------------------------------------------------------------
class 'EDIT' specializing 'DIALOG':
identifier = "Editor";
list_of_resources;
item;
handler = #;
check = ('CHECKITEM');
con = ('CONSOLE');
[
goal:-!.
--
action("select_resource"):-
FN == con ? input_file_name
("Select a file","*.htm*",["HTML Files","*.HTM*"]),!,
put('item',FN).
action("process_resource"):-
[item],
check ? check_item(list_of_resources,item),!,
handler ? process(item),
hide.
action(_):-!.
]
------------------------------------------------------------------------
class 'CHECKITEM':
con = ('CONSOLE');
[
goal:-!.
--
check_item([],_):-!,
con ? note("List is empty!"),
fail.
check_item(_,#):-!,
con ? note("Select an item, please!"),
fail.
check_item(_,_):-!.
]
------------------------------------------------------------------------
package "E:\\A_PROLOG\\MOROZOV\\WEB\\ENGINES\\CONTROL":
------------------------------------------------------------------------
class '_CONTROL_ENGINE':
entry_o1;
value_o1;
world = ('CONTROLDIALOG',
engine = entry_o1);
[
goal:-!.
--
show(_):-!,
world ? show().
]
------------------------------------------------------------------------
class 'CONTROLDIALOG' specializing 'DIALOG':
constant:
engine;
identifier = "Control";
variable:
limit_number_of_pages;
max_page;
constant:
switch = ('SWITCH',
limit_number_of_pages = limit_number_of_pages,
max_page = max_page,
engine = engine);
con = ('CONSOLE');
[
goal:-!,
put('limit_number_of_pages','yes'),
put('max_page',10).
--
set_engine_mode(COUNTPAGES,MAXPAGE):-!,
put('limit_number_of_pages',COUNTPAGES),
put('max_page',MAXPAGE).
]
------------------------------------------------------------------------
class 'SWITCH':
variable:
limit_number_of_pages;
max_page;
constant:
engine;
[
goal:-!,
check(limit_number_of_pages,max_page).
--
check(COUNTPAGES,MAXPAGE):-!,
engine <- set_engine_mode(COUNTPAGES,MAXPAGE).
]
------------------------------------------------------------------------
package "E:\\A_PROLOG\\MOROZOV\\WEB\\ENGINES\\RAMBLER":
import 'ENGINE_SADT_INTERFACE' from "Morozov/Web/Engines/Core";
import 'SEARCHENGINE' from "Morozov/Web/Engines/Core";
------------------------------------------------------------------------
class '_CONSULT_RAMBLER' specializing 'ENGINE_SADT_INTERFACE':
world = ('RAMBLER');
[
]
------------------------------------------------------------------------
class 'RAMBLER' specializing 'SEARCHENGINE':
location = "http://search.rambler.ru";
max_waiting_time = 20.0;
tags = ["DL","DIV"];
text = ('TEXT');
[
prepare_request(WORDS1,REQUEST):-!,
replace_spaces("+","%2B",WORDS1,WORDS2),
replace_spaces(" "," ",WORDS2,WORDS3),
replace_spaces(" ","+",WORDS3,WORDS4),
check_keywords(WORDS4),
REQUEST ==
(("/cgi-bin/rambler_search?words=" + WORDS4)
+ "&where=1").
--
extract_reference_from_tree([block("DL",LIST)|_],R):-
extract_reference_from_block(LIST,R).
extract_reference_from_tree([block("DL",LIST)|_],R):-
extract_reference_from_tree(LIST,R).
extract_reference_from_tree([_|REST],R):-!,
extract_reference_from_tree(REST,R).
--
extract_reference_from_block([ref(TEXT,_)|_],ADDRESS2):-
P == text ? search(TEXT,"URL=HTTP:"),
text ? split((P + 3),TEXT,_,ADDRESS1),
refine_address(ADDRESS1,ADDRESS2).
extract_reference_from_block([ref(_,LIST)|_],R):-
extract_reference_from_tree(LIST,R).
extract_reference_from_block([_|REST],R):-!,
extract_reference_from_block(REST,R).
--
extract_address_of_next_page([block("DIV",[WORD1|LIST])|_],N,A):-
string(WORD1),
parse_list_of_page_numbers(LIST,N,A).
extract_address_of_next_page([_|REST],N,A):-!,
extract_address_of_next_page(REST,N,A).
--
parse_list_of_page_numbers([ref(_,_),"|"|REST],N,A):-!,
parse_list_of_page_numbers(REST,N,A).
parse_list_of_page_numbers([ITEM,"|",ref(A,[N|_])|_],N,A):-!,
text ? convert_to_integer(ITEM),
text ? convert_to_integer(N).
]
------------------------------------------------------------------------
package "E:\\A_PROLOG\\MOROZOV\\WEB\\ENGINES\\GOOGLE":
import 'ENGINE_SADT_INTERFACE' from "Morozov/Web/Engines/Core";
import 'SEARCHENGINE' from "Morozov/Web/Engines/Core";
------------------------------------------------------------------------
class '_CONSULT_GOOGLE' specializing 'ENGINE_SADT_INTERFACE':
world = ('GOOGLE');
[
]
------------------------------------------------------------------------
class 'GOOGLE' specializing 'SEARCHENGINE':
location = "http://www.google.com";
max_waiting_time = 20.0;
tags = ["DIV","P"];
text = ('TEXT');
[
prepare_request(WORDS1,REQUEST):-!,
replace_spaces("+","%2B",WORDS1,WORDS2),
replace_spaces(" "," ",WORDS2,WORDS3),
replace_spaces(" ","+",WORDS3,WORDS4),
check_keywords(WORDS4),
REQUEST == (("/search?q=" + WORDS4) +
"&ie=windows-1251&hl=ru&"
"btnG=%CF%EE%E8%F1%EA+%E2+Google").
--
extract_reference_from_tree([block("DIV",LIST)|_],R):-
extract_reference_from_block_div(LIST,R).
extract_reference_from_tree([_|REST],R):-!,
extract_reference_from_tree(REST,R).
--
extract_reference_from_block_div([block("P",LIST)|_],R):-
extract_reference_from_block_p(LIST,R).
extract_reference_from_block_div([_|REST],R):-
extract_reference_from_block_div(REST,R).
--
extract_reference_from_block_p([ref(TEXT,_)|_],ADDRESS):-!,
refine_address(TEXT,ADDRESS).
extract_reference_from_block_p([_|REST],R):-!,
extract_reference_from_block_p(REST,R).
--
extract_address_of_next_page([block("DIV",LIST)|_],N,A):-
parse_list_of_page_numbers(LIST,N,A),!.
extract_address_of_next_page([_|REST],N,A):-!,
extract_address_of_next_page(REST,N,A).
--
parse_list_of_page_numbers([ITEM,ref(A,[ref(_,_),N|_])|_],N,A):-
string(ITEM),
string(N),
text ? convert_to_integer(ITEM),
text ? convert_to_integer(N),!.
parse_list_of_page_numbers([_|REST],N,A):-!,
parse_list_of_page_numbers(REST,N,A).
]
------------------------------------------------------------------------
package "E:\\A_PROLOG\\MOROZOV\\LINKS\\MERGE":
------------------------------------------------------------------------
class '_MERGE_TWO_LISTS':
value_i1;
value_i2;
value_o1;
con;
[
goal:-!,
con ? clear(),
merge_lists(value_i1,value_i2,value_o1).
--
show(_*):-!,
con ? show().
--
merge_lists([],LIST,LIST):-!.
merge_lists([ITEM|REST],LIST2,LIST3):-
member(ITEM,LIST2),!,
con ? writeln("Common element: ",ITEM),
merge_lists(REST,LIST2,LIST3).
merge_lists([ITEM|REST],LIST2,[ITEM|LIST3]):-
merge_lists(REST,LIST2,LIST3).
--
member(ITEM,[ITEM|_]):-!.
member(ITEM,[_|REST]):-!,
member(ITEM,REST).
]
------------------------------------------------------------------------
package "E:\\A_PROLOG\\MOROZOV\\WEB\\FILTERS\\CHECK":
------------------------------------------------------------------------
class '_CHECK_RESOURCES':
value_i1;
value_o1;
world = ('CHECK_RESOURCES',
search_pattern = value_i1);
[
goal:-!,
value_o1 == self.
--
show(_*):-!,
world ? show().
--
filter(SWITCH,LIST)
= world ? filter(SWITCH,LIST).
]
------------------------------------------------------------------------
class 'CHECK_RESOURCES' specializing 'DIALOG':
constant:
identifier = "Control";
variable:
search_pattern;
constant:
receptor = ('RECEPTOR',
location = "",
max_waiting_time = 12.0,
revision_period = 'none',
attempt_period = 'none');
report = ('REPORT',
x = 5,
y = 5,
width = 70,
height = 20,
title = "Preliminary Check of Files");
protecting:
limit_of_length;
constant:
text = ('TEXT');
con = ('CONSOLE');
[
goal:-!,
initiate_limit_of_length(limit_of_length),
con ? writeln(limit_of_length).
--
initiate_limit_of_length(50000):-!.
initiate_limit_of_length(_):-!.
--
filter('no',#)
= _
:-
!.
filter('no',_)
= _
:-
!.
filter('yes',LIST)
= URL
:-
!,
[search_pattern],
report ? clear(),
report ? show(),
check_resources(LIST,URL).
--
check_resources([URL|_],URL):-
report ? writeln("I check the resource ",URL),
PARAMETERS == receptor ? get_parameters(URL),
select_resource(URL,PARAMETERS).
check_resources([_|REST],URL):-!,
check_resources(REST,URL).
--
select_resource(URL,entry(_,_,_,_,SIZE)):-!,
report ? write("The size of the file: "),
write_size_of_file(SIZE),
check_resource_if_posible(URL,SIZE).
select_resource(URL,ANSWER):-!,
report ? writeln("This resource is not available now:"),
report ? writeln(URL),
report ? writeln("The answer of the server: ",ANSWER),
report ? nl().
--
write_size_of_file(-1):-!,
report ? writeln("unknown.").
write_size_of_file(SIZE):-!,
report ? writeln(SIZE).
--
check_resource_if_posible(URL,SIZE):-
[limit_of_length],
SIZE <= limit_of_length,!,
report ? writeln(
"The size of the file is suitable for "
"preliminary check."),
TEXT == receptor ? get_text(URL),
check_text(URL,TEXT).
check_resource_if_posible(URL,_):-!,
report ? writeln("The file is too big for preliminary check."),
report ? writeln("I have accepted resource ",URL),
report ? nl().
--
check_text(URL,TEXT):-
string(TEXT),
text ? search(TEXT,search_pattern),!,
report ? set_color('black','green'),
report ? writeln(
"The resource has passed "
"the check successfully: ",URL),
report ? set_color('black'),
report ? writeln("I have accepted the resource ",URL),
report ? nl().
check_text(URL,ANSWER):-
string(ANSWER),!,
report ? set_color('red'),
report ? writeln("I have rejected the resource ",URL),
report ? set_color('black'),
report ? nl(),
fail.
check_text(URL,ANSWER):-!,
report ? set_color('blue'),
report ? writeln("I have accepted the resource ",URL),
report ? writeln("The answer of server: ",ANSWER),
report ? set_color('black'),
report ? nl().
]
------------------------------------------------------------------------
package "E:\\A_PROLOG\\MOROZOV\\WEB\\FILTERS\\ENGINE":
------------------------------------------------------------------------
class '_FILTER_LIST':
value_i1;
value_o1;
value_m1;
world = ('FILTER_LIST',
input_list = value_i1,
output_list = value_o1,
check = value_m1);
[
goal:-!.
--
show(_*):-!,
world ? show().
]
------------------------------------------------------------------------
class 'FILTER_LIST' specializing 'DIALOG':
constant:
identifier = "Control";
variable:
input_list;
output_list;
check;
results = check ?? filter(switch,input_list);
switch;
[
goal:-!,
switch_mode(switch).
--
switch_mode('no'):-!,
output_list == input_list.
switch_mode('yes'):-!,
output_list == results.
]
------------------------------------------------------------------------
package "E:\\A_PROLOG\\MOROZOV\\WEB\\ENGINES\\CORE":
import 'CONTROLDIALOG' from "Morozov/Web/Engines/Control";
------------------------------------------------------------------------
class 'ENGINE_SADT_INTERFACE':
constant:
entry_c1;
variable:
value_o1;
constant:
world;
variable:
list_of_resources = world ?? get_resource();
[
goal:-!,
value_o1 == list_of_resources.
--
show(_*):-!,
world ? show().
--
search(_,KEYWORDS):-!,
world ? search(KEYWORDS).
search(KEYWORDS):-!,
world ? search(KEYWORDS).
--
set_engine_mode(_,COUNTPAGES,MAXPAGE):-!,
world ? set_engine_mode(COUNTPAGES,MAXPAGE).
]
------------------------------------------------------------------------
class 'SEARCHENGINE' specializing 'ALPHA':
constant:
control = (('CONTROLDIALOG',
limit_number_of_pages = limit_number_of_pages,
max_page = max_page,
engine = self));
variable:
limit_number_of_pages;
max_page;
constant:
receiver = ('RECEPTOR',
location = location,
max_waiting_time = max_waiting_time,
revision_period = 'none',
attempt_period = 'none',
tags = tags);
variable:
location;
max_waiting_time = 20.0;
tags;
constant:
registry = ('DATABASE');
engine_output = #;
debug_output = #;
text = ('TEXT');
[
goal:-!.
--
show(_*):-!,
control <- show().
--
set_engine_mode(COUNTPAGES,MAXPAGE):-!,
control <- set_engine_mode(COUNTPAGES,MAXPAGE).
--
search(WORDS1):-!,
registry ? clear(),
prepare_request(WORDS1,URL),
self << inspect_page(1,URL).
--
replace_spaces(P,T,S1,S3):-
S2 == text ? replace(S1,P,T),!,
replace_spaces(P,T,S2,S3).
replace_spaces(_,_,S,S):-!.
--
check_keywords(""):-!,
fail.
check_keywords("+"):-!,
fail.
check_keywords(_):-!.
--
inspect_page('no_page',_):-!.
inspect_page(CURRENTPAGE,URL1):-
check_number_of_page(CURRENTPAGE),!,
debug_output ? writeln
("I inspect page ",CURRENTPAGE," at ",URL1),
TREE == receiver ? get_trees(URL1),
report_errors(TREE),
search_useful_data(TREE,NEXTPAGE,URL2),
self << inspect_page(NEXTPAGE,URL2).
inspect_page(_,_).
--
check_number_of_page(CURRENTPAGE):-
limit_number_of_pages == 'yes',!,
integer(CURRENTPAGE),
CURRENTPAGE <= max_page.
check_number_of_page(_):-!.
--
report_errors([]):-!.
report_errors([_|_]):-!.
report_errors(TREE):-!,
debug_output ? writeln("Unexpected answer: ",TREE).
--
search_useful_data(TREE,'no_page',_):-
debug_output ? writeln("I search references..."),
extract_reference_from_tree(TREE,REFERENCE),
engine_output ? found_reference(REFERENCE),
debug_output ? writeln("Address: ",REFERENCE),
save_address(REFERENCE),
fail.
search_useful_data(TREE,NEXTNUMBER,PA):-
debug_output ? writeln
("I search the address of the next page..."),
extract_address_of_next_page(TREE,PN,PA),
string(PN),
NEXTNUMBER == text ? convert_to_integer(PN),
engine_output ? next_page(NEXTNUMBER,PA),
debug_output ? writeln("The Address of the next page: ",PA).
search_useful_data(_,_,_):-!,
debug_output ? writeln("This page was the last one!"),
fail.
--
refine_address(ADDRESS,ADDRESS):-
text ? search(ADDRESS,"HTTP://"),!.
refine_address(A1,A2):-
A2 == text ? replace(A1,"HTTP:/","http://"),!.
refine_address(ADDRESS,ADDRESS):-!.
--
save_address(URL):-
registry ? find(URL),!.
save_address(URL):-!,
registry ? append(URL).
--
reset:-
registry ? clear().
--
get_resource
= URL
:-
registry ? find(URL).
]
------------------------------------------------------------------------
|