📄 geobase.inc
字号:
get_assoc(STRINGLIST,STRINGLIST,STRING)
CLAUSES
pars(LIST,E,Q):-s_attr(LIST,OL,E,Q),check(OL),!.
pars(LIST,_,_):-error(LIST),fail.
/* How big is the city new york -- BIG ENTITY CONSTANT */
s_attr([BIG,ENAME|S1],S2,E1,q_eaec(E1,A,E2,X)):-
ent_name(E2,ENAME),size(E2,BIG),
entitysize(E2,E1),schema(E1,A,E2),
get_ent(S1,S2,X),!.
/* How big is new york -- BIG CONSTANT */
s_attr([BIG|S1],S2,E1,q_eaec(E1,A,E2,X)):-
get_ent(S1,S2,X),
size(E2,BIG),entitysize(E2,E1),
schema(E1,A,E2),ent(E2,X),!.
/* How big is the biggest city -- BIG QUERY */
s_attr([BIG|S1],S2,E1,q_eaq(E1,A,E2,Q)):-
size(_,BIG),s_minmax(S1,S2,E2,Q),
size(E2,BIG),entitysize(E2,E1),
schema(E1,A,E2),!.
s_attr(S1,S2,E,Q):-s_minmax(S1,S2,E,Q).
/* The smallest city -- MIN QUERY */
s_minmax([MIN|S1],S2,E,q_min(E,Q)):-minn(MIN),!,s_rest(S1,S2,E,Q).
/* The biggest city -- MAX QUERY */
s_minmax([MAX|S1],S2,E,q_max(E,Q)):-maxx(MAX),!,s_rest(S1,S2,E,Q).
s_minmax(S1,S2,E,Q):-s_rest(S1,S2,E,Q).
/* give me cities -- ENTITY */
s_rest([ENAME],[],E,q_e(E)):-!,ent_name(E,ENAME).
s_rest([ENAME|S1],S2,E,Q):-ent_name(E,ENAME),s_or(S1,S2,E,Q).
/* And has a higher priority than or */
s_or(S1,S2,E,Q):-s_and(S1,S3,E,Q1),s_or1(S3,S2,E,Q1,Q).
s_or1(["or",ENT|S1],S2,E,Q1,q_or(Q1,Q2)):-ent_name(E,ENT),!,s_or(S1,S2,E,Q2).
s_or1(["or"|S1],S2,E,Q1,q_or(Q1,Q2)):-!,s_or(S1,S2,E,Q2).
s_or1(S,S,_,Q,Q).
s_and(S1,S2,E,Q):-s_elem(S1,S3,E,Q1),s_and1(S3,S2,E,Q1,Q).
s_and1(["and",ENT|S1],S2,E,Q1,q_and(Q1,Q2)):-ent_name(E,ENT),!,s_elem(S1,S2,E,Q2).
s_and1(["and"|S1],S2,E,Q1,q_and(Q1,Q2)):-!,s_elem(S1,S2,E,Q2).
s_and1(S,S,_,Q,Q).
/* not QUERY */
s_elem(["not"|S1],S2,E,q_not(E,Q)):-!,s_assoc(S1,S2,E,Q).
s_elem(S1,S2,E,Q):-s_assoc(S1,S2,E,Q).
/* ... longer than 1 thousand miles -- REL VAL UNIT */
s_assoc(S1,S4,E,q_sel(E,REL,ATTR,VAL)):-
s_rel(S1,S2,REL),s_val(S2,S3,VAL),
s_unit(S3,S4,UNIT),!,unit(ATTR,UNIT).
/* ... longer than 1 thousand -- REL VAL */
s_assoc(S1,S3,E,q_sel(E,REL,ATTR,VAL)):-
s_rel(S1,S2,REL),s_val(S2,S3,VAL),!,
entitysize(E,ATTR).
s_assoc(S1,S3,E,Q):-
get_assoc(S1,S2,A),s_assoc1(S2,S3,E,A,Q).
/* Before s_assoc1 is called ENT ASSOC is met */
/* ... the shortest river in texas -- MIN QUERY */
s_assoc1([MIN|S1],S2,E1,A,q_eaq(E1,A,E2,q_min(E2,Q))):-minn(MIN),!,
s_nest(S1,S2,E2,Q),schema(E1,A,E2).
/* ... the longest river in texas -- MAX QUERY */
s_assoc1([MAX|S1],S2,E1,A,q_eaq(E1,A,E2,q_max(E2,Q))):-maxx(MAX),!,
s_nest(S1,S2,E2,Q),schema(E1,A,E2).
/* ... with a population that is smaller than 1 million citizens --
ENT REL VAL UNIT */
s_assoc1([ATTR|S1],S4,E,A,q_sel(E,REL,ATTR,VAL)):-
s_rel(S1,S2,REL),s_val(S2,S3,VAL),s_unit(S3,S4,UNIT1),!,
ent_name(E2,ATTR),schema(E,A,E2),unit(E2,UNIT),
UNIT=UNIT1,!.
/* ... with a population that are smaller than 1 million -- ENT REL VAL */
s_assoc1([ATTR|S1],S3,E,A,q_sel(E,REL,ATTR,VAL)):-
s_rel(S1,S2,REL),s_val(S2,S3,VAL),!,
ent_name(E2,ATTR),schema(E,A,E2),unit(E2,_).
/* ... that is smaller than 1 million citizens -- REL VAL UNIT */
s_assoc1(S1,S4,E,A,q_sel(E,REL,E2,VAL)):-
s_rel(S1,S2,REL),s_val(S2,S3,VAL),s_unit(S3,S4,UNIT1),!,
schema(E,A,E2),unit(E2,UNIT),
UNIT=UNIT1,!.
/* ... that is smaller than 1 million -- REL VAL */
s_assoc1(S1,S3,E,A,q_sel(E,REL,E2,VAL)):-
s_rel(S1,S2,REL),s_val(S2,S3,VAL),!,
schema(E,A,E2),unit(E2,_).
/* ... with a population on 1 million citizens -- ENT VAL UNIT */
s_assoc1([ATTR|S1],S3,E,A,q_sel(E,eq,ATTR,VAL)):-
s_val(S1,S2,VAL),s_unit(S2,S3,UNIT1),!,
ent_name(E2,ATTR),schema(E,A,E2),unit(E2,UNIT2),UNIT1=UNIT2,!.
/* ... with a population on 1 million -- ENT VAL */
s_assoc1([ATTR|S1],S2,E,A,q_sel(E,eq,ATTR,VAL)):-
s_val(S1,S2,VAL),
ent_name(E2,ATTR),schema(E,A,E2),unit(E2,_),!.
/* .. the state new york -- ENT CONST */
s_assoc1([ENAME|S1],S2,E1,A,q_eaec(E1,A,E2,X)):-
get_ent(S1,S2,X),ent_name(E2,ENAME),
not(unit(E2,_)),
schema(E1,A,E2),
ent(E2,X),!.
s_assoc1(S1,S2,E1,A,q_eaq(E1,A,E2,Q)):-
s_nest(S1,S2,E2,Q),schema(E1,A,E2),!.
/* .. new york -- CONST */
s_assoc1(S1,S2,E1,A,q_eaec(E1,A,E2,X)):-
get_ent(S1,S2,X),schema(E1,A,E2),ent(E2,X),!.
/* Parse a nested query */
s_nest([ENAME|S1],S2,E,Q):-ent_name(E,ENAME),s_elem(S1,S2,E,Q).
s_nest([ENAME|S],S,E,q_e(E)):-ent_name(E,ENAME).
/* ... runs through texas -- ASSOC REST */
get_assoc(IL,OL,A):-append(ASL,OL,IL),assoc(A,ASL).
/*************************************************************************
EVALUATION OF QUESTIONS
*************************************************************************/
PREDICATES /* Support predicates for the parser */
sel_min(STRING,STRING,REAL,STRING,STRING,STRINGLIST)
sel_max(STRING,STRING,REAL,STRING,STRING,STRINGLIST)
CLAUSES
eval(q_min(ENT,TREE),ANS):-
findall(X,eval(TREE,X),L),
entitysize(ENT,ATTR),
sel_min(ENT,ATTR,99e99,"",ANS,L).
eval(q_max(ENT,TREE),ANS):-
findall(X,eval(TREE,X),L),
entitysize(ENT,ATTR),
sel_max(ENT,ATTR,-1,"",ANS,L).
eval(q_sel(E,gt,ATTR,VAL),ANS):-
schema(ATTR,ASSOC,E),
db(ATTR,ASSOC,E,SVAL2,ANS),
str_real(SVAL2,VAL2),
VAL2>VAL.
eval(q_sel(E,lt,ATTR,VAL),ANS):-
schema(ATTR,ASSOC,E),
db(ATTR,ASSOC,E,SVAL2,ANS),
str_real(SVAL2,VAL2),
VAL2<VAL.
eval(q_sel(E,eq,ATTR,VAL),ANS):-
schema(ATTR,ASSOC,E),
db(ATTR,ASSOC,E,SVAL,ANS),
str_real(SVAL,VAL).
eval(q_not(E,TREE),ANS):-
findall(X,eval(TREE,X),L),
ent(E,ANS),
not(member(ANS,L)).
eval(q_eaq(E1,A,E2,TREE),ANS):-
eval(TREE,VAL),db(E1,A,E2,ANS,VAL).
eval(q_eaec(E1,A,E2,C),ANS):-db(E1,A,E2,ANS,C).
eval(q_e(E),ANS):- ent(E,ANS).
eval(q_or(TREE,_),ANS):- eval(TREE,ANS).
eval(q_or(_,TREE),ANS):- eval(TREE,ANS).
eval(q_and(T1,T2),ANS):- eval(T1,ANS1),eval(T2,ANS),ANS=ANS1.
sel_min(_,_,_,RES,RES,[]).
sel_min(ENT,ATTR,MIN,_,RES,[H|T]):-schema(ATTR,ASSOC,ENT),
db(ATTR,ASSOC,ENT,VAL,H),
str_real(VAL,HH),MIN>HH,!,
sel_min(ENT,ATTR,HH,H,RES,T).
sel_min(ENT,ATTR,MIN,NAME,RES,[_|T]):-sel_min(ENT,ATTR,MIN,NAME,RES,T).
sel_max(_,_,_,RES,RES,[]).
sel_max(ENT,ATTR,MAX,_,RES,[H|T]):-
schema(ATTR,ASSOC,ENT),
db(ATTR,ASSOC,ENT,VAL,H),
str_real(VAL,HH),MAX<HH,!,
sel_max(ENT,ATTR,HH,H,RES,T).
sel_max(ENT,ATTR,MAX,NAME,RES,[_|T]):-sel_max(ENT,ATTR,MAX,NAME,RES,T).
/**************************************************************************
MAIN MENU - Here begins the user interface which demonstrates
how to process an action from a list of choices.
**************************************************************************/
PREDICATES
/* Main loop */
natlang
loaddba
savedba
mainmenu
proces(INTEGER)
/* View and update the language */
viewlang viewlang1(INTEGER)
updatelang updatelang1(INTEGER)
GOAL loaddba, natlang.
CLAUSES
natlang:-
makewindow(21,112,0,"",24,0,1,80),
write("ESC: Quit this menu -- Use arrow keys to select and hit RETURN to activate."),
makewindow(22,112,0,"",24,0,1,80),
write("Esc: Quit F8: Last line Ctrl S: Stop output End: End of line"),
makewindow(2,7,7,"GEOBASE: Natural language interface to U.S. geography",0,0,24,80),
mainmenu.
mainmenu:- repeat,
menu(8,49,14,6,
[ "Tutorial",
"DOS Shell",
"Editor",
"哪哪哪哪哪哪哪哪哪
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -