Initializing clauses for the global fact can be placed only after the GOAL section in the main module: max_seas
17.11.2018, 17:28. Показов 1202. Ответов 2
Всем доброго времени суток.
Не шарю в прологе, как и в других декларативных языках. Прошу помочь решить проблему.
Вот сам код, почти всё работает, за исключением 1го вопроса, где надо определить страну с количеством морей.
| Prolog | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
| global domains
world= world(country, square, geography, population)
country = string
countries=country*
square = integer
geography = geo(materic, oceans, seas, mountains)
sea, ocean, mountain, continent, materic = string
oceans = ocean*
seas = sea*
mountains = mountain*
population = pop(quantity , languages, nations)
quantity, nquant, quant = integer
quantities=quantity*
language = string
languages = language*
nations = nat(nnames,nquantities, npercent)%National part
nname = string
nquantities=nquantity*
npercent=percent*
percent, nquantity = integer
count, velichina=integer
% list=integer*
%lists=string*
% Listint=integer*
nnames=string*
global facts
max_Seas(country,byte) %Êàæäîé ñòðàíå äà¸ò êîë-âî ìîðåé
mount_Countries(country,mountain)% Îïðåäåëÿåò ïðèíàäëåæíîñòü êîíêðåòíîãî ãîðíîãî õðåáòà êîíêðåòíîé ñòðàíå
predicates
owns(world)
%owns(world(country, square, geography, population)
counter( seas,byte) %Êàæäîìó ñïèñêó ìîðåé âû÷èñëÿåò èõ êîëè÷åñòâî
member(mountains,mountain)%Îïðåäåëÿåò, ñîâïàäàåò ëè mountain ñ ýëåìåíòàìè ñïèñêà mountains
nat_count(nquantities,byte) %Îïðåäåëÿåò, ïðåâûøàåò ëè êîë-âî ýëåìåíòîâ ñïèñêà nquantities ÷èñëî byte
quant_count(quantities,byte) %Îïðåäåëÿåò, ìåíüøå ëè êîë-âî ýëåìåíòîâ ñïèñêà quantities ÷åì ÷èñëî byte
max_seas_country(Country)%1-st question
mountain_countries(Mountain)%2-nd question
national_count(Count)%3-th question
gornie_hrebti(Country)%4-th question
chislennost(Velichina)%5-th question
clauses
owns( world("Ðîññèÿ",1600,geo("Åâðàçèÿ",["Àòëàíòè÷åñêèé","Òèõèé","Ñåâåðíûé Ëåäîâèòûé"],["׸ðíîå","Áåðåíöåâî","Êàñïèéñêîå","Àçîâñêîå"],
["Caucasus","Altay","Ural","Camchat"]),pop(145,["Ðóññêèé"],
nat(["Ðóññêèå","Òàòàðû","Óêðàèíöû","Êàâêàçöû","Ìîëäîâàíå"],[130,5,1,8,1],[90,2,1,6,1])))).
owns(world("Ïîëüøà",314,geo("Åâðàçèÿ",[],["Áàëòèéñêîå"],["Êàðïàòû","Ñóäåö"]),pop(36,["Ïîëüñêèé"],
nat(["Ðóññêèå","Ïîëÿêè"],[1,35],[2,98])))).
owns(world("Êèòàé",9597,geo("Åâðàçèÿ",["Òèõèé"],["Ƹëòîå"],["Òèáåò","Ãèìàëàè"]),
pop(1030,["Êèòàéñêèé"],nat(["Êèòàéöû","Êîðåéöû"],[1020,10],[99,1])))).
owns(world("Åãèïåò",1001,geo("Àôðèêà",[],["Êðàñíîå"],[]),pop(45,["Àðàáñêèé","Àíãëèéñêèé"],nat(["Àðàáû","Àôðèêàíöû"],[43,2],[98,2])))).
owns(world("ÑØÀ",9363,geo("Àìåðèêà",["Àòëàíòè÷åñêèé","Òèõèé"],["Áåðèíãîâî"],["Àïàëà÷è","Ñêàëèñòûå ãîðû"]),
pop(232,["English","Spanish"],nat(["Àìåðèêà","Spanish"],[222,10],[96,4])))).
owns(world("Àðãåíòèíà",2767,geo("Àìåðèêà",["Àòëàíòè÷åñêèé","Òèõèé"],[],["Àïàëà÷è"]),pop(28,["Èñïàíñêèé"],
nat(["Àðãåíòèíöû"],[23],[82])))).
owns(world("Àâñòðàëèÿ",7686,geo("Àâñòðàëèÿ",["Òèõèé"],["Òàñìàíîâî"],["Ôëèíäåðñ","Ìàê-Äîííåëë"]),
pop(14,["Àíãëèéñêèé"],nat(["Àâñòðàëèéöû","Íîâîçåëàíäöû"],[13,1],[97,3])))).
owns(world("Íîâàÿ Çåëàíäèÿ",268,geo("Àâñòðàëèÿ",["Òèõèé"],["Òàñìàíîâî"],["Ãîðà Êóêà"]),
pop(3,["Àíãëèéñêèé"],nat(["Íîâîçåëàíäöû"],[3],[100])))).
/*-------------------------------The first question----------------------------------*/
counter([],0). %Åñëè ñïèñîê ïóñòîé, òî òî åãî äëèíà=1
counter([H|T],N):-counter(T,M),N=M+1. %Îòäåëÿåì ãîëîâó ñïèñêà ìîðåé îò õâîñòà, è â ñ÷¸ò÷èê %çàïèñûâàåì N
max_Seas("À",0). %Ïðåäïîëîãàåì, ÷òî ýòî ìàêñèìóì
%retract – óäàëåíèå ôàêòà èç ÁÄ
%assertz – äîáàâëåíèå ôàêòà â êîíåö ÁÄ
%Òóò èä¸ò îáû÷íûé àëãîðèòì ïîèñêà ìàêñèìóìà â ìàññèâå. Ïóñòü max_Seas("A",0) – Ñòðàíà ñ %ìàêñèìàëüíûì êîë-âîì ìîðåé. Ïðîõîäèì ïî íàøåé ÁÄ. Åñëè íàì âñòðå÷àåòñÿ ñòðàíà ñ áîëüøèì %êîë-âîì ìîðåé, òî ìû óäàëÿåì èç ÁÄ ñòàðóþ ñòðàíó (ñòàðûé ìàêñèìóì), à íîâóþ ñòðàíó (íîâûé %ìàêñèìóì) çàïèñûâàåì â êîíåö ÁÄ. È ïîòîì âûâîäèì íàøó ñòðàíó íà ýêðàí.
max_seas_country(Country):- owns(world(Country,_,geo(_,_,L,_),_)),counter(L,N),
max_Seas(Country1,N1), N>N1,retract( max_Seas(Country1,N1)),
assertz(max_Seas(Country,N)).
/*-----------------------------------Second question-------------------------------*/
member([H|_],H).
member([_|T],X):-member(T,X).
% mount_Countries("B","Òèáåò").%Strana i gornaya vershina
%Áåð¸ì 1-þ ñòðàíó èç ÁÄ. Ïðîñìàòðèâàåì ñïèñîê ãîðíûõ õðåáòîâ. Åñëè íóæíûé ãîðíûé õðåáåò â ñïèñêå (ïðåäèêàò member), òî âûâîäèì íà ýêðàí ñòðàíó. Òàêæå ñ îñòàëüíûìè ñòðàíàìè.
mountain_countries(Mountain):-owns(world(Country,_,geo(_,_,_,L),_)),member(L,Mountain),write(Country),nl,fail.
/*----------------------------------3-th question------------------------------------*/
nat_count([],0).
nat_count([H|T],K):-nat_count(T,M),K=M+1.
%Ñìîòðèì 1-þ ñòðàíó èç ÁÄ. Ñìîòðèì ñïèñîê íàöèîíàëüíîñòåé. Åñëè êîë-âî ýëåìåíòîâ ýòîãî ñïèñêà áîëüøå çàäàííîé âåëè÷èíû, òî âûâîäèì ñòðàíó íà ýêðàí. Òàêæå ñ îñòàëüíûìè ñòðàíàìè èç ÁÄ.
national_count(Count):-owns(world(Country, _, _, pop(_ , _, nat(_,L, _)) )),nat_count(L,K),K>Count,write(Country),nl,fail.
national_count(_).
/*------------------------------4-th question-------------------------------------*/
%gornie_hrebti(Country):-owns(Country, _,geo(_, _, _, _) , _),write(mountains),nl.
%gornie_hrebti(Country):-findall(mountains,owns(Country, _, geo(_, _, _, mountains), _),M_list ),write(mountains),nl.
%Ó óêàçàííîé ñòðàíû ïðîñòî ðàñïå÷àòûâàåì ñïèñîê ãîðíûõ õðåáòîâ
gornie_hrebti(Country):-owns(world(Country, _, geo(_, _, _, Mountains), _)),write(Mountains),nl.
/*----------------------------------------5-th question-------------------------------*/
quant_count([],0).
quant_count([H|T],K):-quant_count(T,M),K=M+1.
%chislennost(Velichina):-owns(Country, _, _, pop(Quantity , _, _)),quant_count(L,K),K<Velichina,write(Country),nl,fail.
%chislennost(_).
%Ïîñëåäîâàòåëüíî ïðîõîäèì ïî ÁÄ. Åñëè ó òåêóùåé ñòðàíû ÷èñëåííîñòü íàñåëåíèÿ (Quantity) < çàäàííîé âåëè÷èíû (Velichina), òî âûâîäèì òåêóùóþ ñòðàíó íà ýêðàí
chislennost(Velichina):-owns(world(Country, _, _, pop(Quantity, _, _))),Quantity<Velichina,write(Country),nl,fail.
chislennost(_).
goal
N=0,X="A",max_Seas(X,N),max_seas_country(X),write(N),fail;
write("Ââåäèòå ãîðíûé õðåáåò: "),readln(X),write("Óêàçàííûé ãîðíûé õðåáåò ðàñïîëàãàåòñÿ íà òåððèòîðèè ñëåäóþùèõ ñòðàí: "),nl,not(mountain_countries(X)),fail;
write("Ââåäèòå ÷èñëî íàöèîíàëüíîñòåé: "),readint(X),nl,write("Ñòðàíû, ÷èñëî íàöèîíàëüíîñòè êîòîðûõ ïðåâûøàåò óêàçàííîå: "),nl,national_count(X),fail;
write("Ââåäèòå ñòðàíó: "),readln(X),nl,write("Ãîðíûå õðåáåòû, ðàñïîëîæåííûå íà òåððèòîðèè óêàçàííîé ñòðàíû: "),nl,gornie_hrebti(X),fail;
write("Ââåäèòå ÷èñëåííîñòü íàñåëåíèÿ: "),readint(X),nl,write("Ñòðàíû, ÷èñëåííîñòü íàñåëåíèÿ êîòîðîé ìåíüøå çàäàííîé: "),nl,chislennost(X). |
|
Не обращайте внимания на иероглифы, из Пролога по-человечески не копируется.
Собственно, выдаёт ошибку "Initializing clauses for the global fact can be placed only after the GOAL section in the main module: max_seas". Как я понял, max_seas должен быть объявлен после секции goal. Я пробовал закомментировать max_seas в секции caluses, тогда просто не обрабатывается 1-ый вопрос. Заранее спасибо, если кто-то чем-то поможет.
Добавлено через 35 минут
Если написать вот так:
| Prolog | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
| global domains
world= world(country, square, geography, population)
country = string
countries=country*
square = integer
geography = geo(materic, oceans, seas, mountains)
sea, ocean, mountain, continent, materic = string
oceans = ocean*
seas = sea*
mountains = mountain*
population = pop(quantity , languages, nations)
quantity, nquant, quant = integer
quantities=quantity*
language = string
languages = language*
nations = nat(nnames,nquantities, npercent)%National part
nname = string
nquantities=nquantity*
npercent=percent*
percent, nquantity = integer
count, velichina=integer
% list=integer*
%lists=string*
% Listint=integer*
nnames=string*
global facts
max_Seas(country,byte) %Êàæäîé ñòðàíå äà¸ò êîë-âî ìîðåé
mount_Countries(country,mountain)% Îïðåäåëÿåò ïðèíàäëåæíîñòü êîíêðåòíîãî ãîðíîãî õðåáòà êîíêðåòíîé ñòðàíå
predicates
owns(world)
%owns(world(country, square, geography, population)
counter( seas,byte) %Êàæäîìó ñïèñêó ìîðåé âû÷èñëÿåò èõ êîëè÷åñòâî
member(mountains,mountain)%Îïðåäåëÿåò, ñîâïàäàåò ëè mountain ñ ýëåìåíòàìè ñïèñêà mountains
nat_count(nquantities,byte) %Îïðåäåëÿåò, ïðåâûøàåò ëè êîë-âî ýëåìåíòîâ ñïèñêà nquantities ÷èñëî byte
quant_count(quantities,byte) %Îïðåäåëÿåò, ìåíüøå ëè êîë-âî ýëåìåíòîâ ñïèñêà quantities ÷åì ÷èñëî byte
max_seas_country(Country)%1-st question
mountain_countries(Mountain)%2-nd question
national_count(Count)%3-th question
gornie_hrebti(Country)%4-th question
chislennost(Velichina)%5-th question
clauses
owns( world("Ðîññèÿ",1600,geo("Åâðàçèÿ",["Àòëàíòè÷åñêèé","Òèõèé","Ñåâåðíûé Ëåäîâèòûé"],["׸ðíîå","Áåðåíöåâî","Êàñïèéñêîå","Àçîâñêîå"],
["Caucasus","Altay","Ural","Camchat"]),pop(145,["Ðóññêèé"],
nat(["Ðóññêèå","Òàòàðû","Óêðàèíöû","Êàâêàçöû","Ìîëäîâàíå"],[130,5,1,8,1],[90,2,1,6,1])))).
owns(world("Ïîëüøà",314,geo("Åâðàçèÿ",[],["Áàëòèéñêîå"],["Êàðïàòû","Ñóäåö"]),pop(36,["Ïîëüñêèé"],
nat(["Ðóññêèå","Ïîëÿêè"],[1,35],[2,98])))).
owns(world("Êèòàé",9597,geo("Åâðàçèÿ",["Òèõèé"],["Ƹëòîå"],["Òèáåò","Ãèìàëàè"]),
pop(1030,["Êèòàéñêèé"],nat(["Êèòàéöû","Êîðåéöû"],[1020,10],[99,1])))).
owns(world("Åãèïåò",1001,geo("Àôðèêà",[],["Êðàñíîå"],[]),pop(45,["Àðàáñêèé","Àíãëèéñêèé"],nat(["Àðàáû","Àôðèêàíöû"],[43,2],[98,2])))).
owns(world("ÑØÀ",9363,geo("Àìåðèêà",["Àòëàíòè÷åñêèé","Òèõèé"],["Áåðèíãîâî"],["Àïàëà÷è","Ñêàëèñòûå ãîðû"]),
pop(232,["English","Spanish"],nat(["Àìåðèêà","Spanish"],[222,10],[96,4])))).
owns(world("Àðãåíòèíà",2767,geo("Àìåðèêà",["Àòëàíòè÷åñêèé","Òèõèé"],[],["Àïàëà÷è"]),pop(28,["Èñïàíñêèé"],
nat(["Àðãåíòèíöû"],[23],[82])))).
owns(world("Àâñòðàëèÿ",7686,geo("Àâñòðàëèÿ",["Òèõèé"],["Òàñìàíîâî"],["Ôëèíäåðñ","Ìàê-Äîííåëë"]),
pop(14,["Àíãëèéñêèé"],nat(["Àâñòðàëèéöû","Íîâîçåëàíäöû"],[13,1],[97,3])))).
owns(world("Íîâàÿ Çåëàíäèÿ",268,geo("Àâñòðàëèÿ",["Òèõèé"],["Òàñìàíîâî"],["Ãîðà Êóêà"]),
pop(3,["Àíãëèéñêèé"],nat(["Íîâîçåëàíäöû"],[3],[100])))).
/*-------------------------------The first question----------------------------------*/
counter([],0). %Åñëè ñïèñîê ïóñòîé, òî òî åãî äëèíà=1
counter([H|T],N):-counter(T,M),N=M+1. %Îòäåëÿåì ãîëîâó ñïèñêà ìîðåé îò õâîñòà, è â ñ÷¸ò÷èê %çàïèñûâàåì N
max_Seas("À",0). %Ïðåäïîëîãàåì, ÷òî ýòî ìàêñèìóì
%retract – óäàëåíèå ôàêòà èç ÁÄ
%assertz – äîáàâëåíèå ôàêòà â êîíåö ÁÄ
%Òóò èä¸ò îáû÷íûé àëãîðèòì ïîèñêà ìàêñèìóìà â ìàññèâå. Ïóñòü max_Seas("A",0) – Ñòðàíà ñ %ìàêñèìàëüíûì êîë-âîì ìîðåé. Ïðîõîäèì ïî íàøåé ÁÄ. Åñëè íàì âñòðå÷àåòñÿ ñòðàíà ñ áîëüøèì %êîë-âîì ìîðåé, òî ìû óäàëÿåì èç ÁÄ ñòàðóþ ñòðàíó (ñòàðûé ìàêñèìóì), à íîâóþ ñòðàíó (íîâûé %ìàêñèìóì) çàïèñûâàåì â êîíåö ÁÄ. È ïîòîì âûâîäèì íàøó ñòðàíó íà ýêðàí.
max_seas_country(Country):- owns(world(Country,_,geo(_,_,L,_),_)),counter(L,N),
max_Seas(Country1,N1), N>N1,retract( max_Seas(Country1,N1)),
assertz(max_Seas(Country,N)),write(Country," ",N),nl.
/*-----------------------------------Second question-------------------------------*/
member([H|_],H).
member([_|T],X):-member(T,X).
% mount_Countries("B","Òèáåò").%Strana i gornaya vershina
%Áåð¸ì 1-þ ñòðàíó èç ÁÄ. Ïðîñìàòðèâàåì ñïèñîê ãîðíûõ õðåáòîâ. Åñëè íóæíûé ãîðíûé õðåáåò â ñïèñêå (ïðåäèêàò member), òî âûâîäèì íà ýêðàí ñòðàíó. Òàêæå ñ îñòàëüíûìè ñòðàíàìè.
mountain_countries(Mountain):-owns(world(Country,_,geo(_,_,_,L),_)),member(L,Mountain),write(Country),nl,fail.
/*----------------------------------3-th question------------------------------------*/
nat_count([],0).
nat_count([H|T],K):-nat_count(T,M),K=M+1.
%Ñìîòðèì 1-þ ñòðàíó èç ÁÄ. Ñìîòðèì ñïèñîê íàöèîíàëüíîñòåé. Åñëè êîë-âî ýëåìåíòîâ ýòîãî ñïèñêà áîëüøå çàäàííîé âåëè÷èíû, òî âûâîäèì ñòðàíó íà ýêðàí. Òàêæå ñ îñòàëüíûìè ñòðàíàìè èç ÁÄ.
national_count(Count):-owns(world(Country, _, _, pop(_ , _, nat(_,L, _)) )),nat_count(L,K),K>Count,write(Country),nl,fail.
national_count(_).
/*------------------------------4-th question-------------------------------------*/
%gornie_hrebti(Country):-owns(Country, _,geo(_, _, _, _) , _),write(mountains),nl.
%gornie_hrebti(Country):-findall(mountains,owns(Country, _, geo(_, _, _, mountains), _),M_list ),write(mountains),nl.
%Ó óêàçàííîé ñòðàíû ïðîñòî ðàñïå÷àòûâàåì ñïèñîê ãîðíûõ õðåáòîâ
gornie_hrebti(Country):-owns(world(Country, _, geo(_, _, _, Mountains), _)),write(Mountains),nl.
/*----------------------------------------5-th question-------------------------------*/
quant_count([],0).
quant_count([H|T],K):-quant_count(T,M),K=M+1.
%chislennost(Velichina):-owns(Country, _, _, pop(Quantity , _, _)),quant_count(L,K),K<Velichina,write(Country),nl,fail.
%chislennost(_).
%Ïîñëåäîâàòåëüíî ïðîõîäèì ïî ÁÄ. Åñëè ó òåêóùåé ñòðàíû ÷èñëåííîñòü íàñåëåíèÿ (Quantity) < çàäàííîé âåëè÷èíû (Velichina), òî âûâîäèì òåêóùóþ ñòðàíó íà ýêðàí
chislennost(Velichina):-owns(world(Country, _, _, pop(Quantity, _, _))),Quantity<Velichina,write(Country),nl,fail.
chislennost(_).
goal
write("Ñòðàíà ñ ìàêñèìàëüíûì êîëè÷åñòâîì ìîðåé: "),nl,max_Seas(C,N),max_seas_country(X),nl,fail;
write("Ââåäèòå ãîðíûé õðåáåò: "),readln(X),write("Óêàçàííûé ãîðíûé õðåáåò ðàñïîëàãàåòñÿ íà òåððèòîðèè ñëåäóþùèõ ñòðàí: "),nl,not(mountain_countries(X)),fail;
write("Ââåäèòå ÷èñëî íàöèîíàëüíîñòåé: "),readint(X),nl,write("Ñòðàíû, ÷èñëî íàöèîíàëüíîñòè êîòîðûõ ïðåâûøàåò óêàçàííîå: "),nl,national_count(X),fail;
write("Ââåäèòå ñòðàíó: "),readln(X),nl,write("Ãîðíûå õðåáåòû, ðàñïîëîæåííûå íà òåððèòîðèè óêàçàííîé ñòðàíû: "),nl,gornie_hrebti(X),fail;
write("Ââåäèòå ÷èñëåííîñòü íàñåëåíèÿ: "),readint(X),nl,write("Ñòðàíû, ÷èñëåííîñòü íàñåëåíèÿ êîòîðîé ìåíüøå çàäàííîé: "),nl,chislennost(X). |
|
И вызвать через ctrl+g, то работает нормально, но это режим отладки. Мне нужно, чтобы нормально через f9 работало.
0
|