xy("a",3,7).
xy("b",4,6).
xy("c",4,5).
xy("d",2,3).
xy("g",5,4).
xy("h",7,2).
xy("n",8,4).
xy("s",7,1).
xy("f",10,2).
cmp(A, B, C):-
xy(A, XA, YA),
xy(B, XB, YB),
C
is sqrt(((XA
-XB
)*(XA
-XB
)) + ((YA
-YB
)*(YA
-YB
))).
cost(A, AY, C):-
cmp(A, AY, C).
hn(N, HN):-
theGoal(S),
xy(S, XS, YS),
xy(N, XN, YN),
HN
is sqrt(((XN
-XS
)*(XN
-XS
)) + ((YN
-YS
)*(YN
-YS
))).
sear([T|Queue], S):-
( goalReached(T)
-> S = T
; Extension = [E || toDaughter(T,E)],
NewQueue = list::append(Queue,Extension),
BestFirst = list::sortBy(cmp,NewQueue),
sear(BestFirst, S)
).
toDaughter
(t
(_F
, G
, [r
(B
, N
)|Path
]), t
(F1
, G1
, [r
(Op, Child
), r
(B
, N
)|Path
])):- format
(atom(Op), "Винни
-Пух передвигается из пункта ~w в пункт ~w"
, [N
, Child
]), not_in_circle(Child, Path),
G1
is G
+ cost
(N
, Child
, _
), hn(Child, HN),
prtSolution(t(_, _, T)):-
foreach X = getMember_nd(reverse(T)) do
end foreach.
solve():-
( init(E) ->
sear([t(hn(E),0,[r("",E)])],S),
write("\nВинниПух начинает движение из пункта
: "
,E
,"\n"
);
prtSolution(S);
).
run():-
solve(),
:- main.
b3AoImEiLCJiIikuCm9wKCJiIiwiYyIpLgpvcCgiYyIsImQiKS4Kb3AoImQiLCJjIikuCm9wKCJjIiwiZyIpLgpvcCgiZyIsImgiKS4Kb3AoImQiLCJoIikuCm9wKCJoIiwibiIpLgpvcCgibiIsImgiKS4Kb3AoImgiLCJzIikuCm9wKCJzIiwiZiIpLgpvcCgibiIsImYiKS4KCnh5KCJhIiwzLDcpLgp4eSgiYiIsNCw2KS4KeHkoImMiLDQsNSkuCnh5KCJkIiwyLDMpLgp4eSgiZyIsNSw0KS4KeHkoImgiLDcsMikuCnh5KCJuIiw4LDQpLgp4eSgicyIsNywxKS4KeHkoImYiLDEwLDIpLgoKY21wKEEsIEIsIEMpOi0KICAgIHh5KEEsIFhBLCBZQSksCiAgICB4eShCLCBYQiwgWUIpLAogICAgQyBpcyBzcXJ0KCgoWEEtWEIpKihYQS1YQikpICsgKChZQS1ZQikqKFlBLVlCKSkpLgoKY29zdChBLCBBWSwgQyk6LQogICAgY21wKEEsIEFZLCBDKS4KCmhuKE4sIEhOKTotCiAgICB0aGVHb2FsKFMpLAogICAgeHkoUywgWFMsIFlTKSwKICAgIHh5KE4sIFhOLCBZTiksCiAgICBITiBpcyBzcXJ0KCgoWE4tWFMpKihYTi1YUykpICsgKChZTi1ZUykqKFlOLVlTKSkpLgoKc2VhcihbVHxRdWV1ZV0sIFMpOi0KICAgICggICBnb2FsUmVhY2hlZChUKQogICAgLT4gIFMgPSBUCiAgICA7ICAgRXh0ZW5zaW9uID0gW0UgfHwgdG9EYXVnaHRlcihULEUpXSwKICAgICAgICBOZXdRdWV1ZSA9IGxpc3Q6OmFwcGVuZChRdWV1ZSxFeHRlbnNpb24pLAogICAgICAgIEJlc3RGaXJzdCA9IGxpc3Q6OnNvcnRCeShjbXAsTmV3UXVldWUpLAogICAgICAgIHNlYXIoQmVzdEZpcnN0LCBTKQogICAgKS4KCnRvRGF1Z2h0ZXIodChfRiwgRywgW3IoQiwgTil8UGF0aF0pLCB0KEYxLCBHMSwgW3IoT3AsIENoaWxkKSwgcihCLCBOKXxQYXRoXSkpOi0gCiAgICBvcChOLCBDaGlsZCksCiAgICBmb3JtYXQoYXRvbShPcCksICLQktC40L3QvdC4LdCf0YPRhSDQv9C10YDQtdC00LLQuNCz0LDQtdGC0YHRjyDQuNC3INC/0YPQvdC60YLQsCB+dyDQsiDQv9GD0L3QutGCIH53IiwgW04sIENoaWxkXSksCiAgICBub3RfaW5fY2lyY2xlKENoaWxkLCBQYXRoKSwKICAgIEcxIGlzIEcgKyBjb3N0KE4sIENoaWxkLCBfKSwKICAgIGhuKENoaWxkLCBITiksCiAgICBGMSBpcyBHMSArIEhOLgoKcHJ0U29sdXRpb24odChfLCBfLCBUKSk6LQogICAgZm9yZWFjaCBYID0gZ2V0TWVtYmVyX25kKHJldmVyc2UoVCkpIGRvCiAgICAgICAgd3JpdGUoIiIsIFgpLAogICAgICAgIG5sCiAgICBlbmQgZm9yZWFjaC4KCnNvbHZlKCk6LQogICAgKCBpbml0KEUpIC0+CiAgICAgICAgc2VhcihbdChobihFKSwwLFtyKCIiLEUpXSldLFMpLAogICAgICAgIHdyaXRlKCJcbtCS0LjQvdC90LjQn9GD0YUg0L3QsNGH0LjQvdCw0LXRgiDQtNCy0LjQttC10L3QuNC1INC40Lcg0L/Rg9C90LrRgtCwIDogIixFLCJcbiIpOwogICAgCiAgICAgICAgcHJ0U29sdXRpb24oUyk7CiAgICAKICAgICAgICB3cml0ZSgi0J3QtdGCINGA0LXRiNC10L3QuNGPIikKICAgICkuCnJ1bigpOi0KICAgIHNvbHZlKCksCiAgICB3cml0ZSgiRU5EIiksbmwuCgo6LSBtYWluLg==