-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerator.pl
49 lines (37 loc) · 1.23 KB
/
generator.pl
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
?- style_check(-discontiguous).
:- [dynamics, completionist, world_def].
requires(LOCATION, EQUIPMENT) :- rq(LOCATION, EQUIPMENT), !; EQUIPMENT = [].
set_items(LOCATIONS, ITEMS) :-
set_item(LOCATIONS, ITEMS, REMAINING_LOCATIONS, REMAINING_ITEMS),
set_items(REMAINING_LOCATIONS, REMAINING_ITEMS).
set_items(_, []).
set_item([H_LOCATIONS|T_LOCATIONS], [H_ITEMS|T_ITEMS], REMAINING_LOCATIONS, REMAINING_ITEMS) :-
terminal_location(H_LOCATIONS) -> (
REMAINING_LOCATIONS = T_LOCATIONS,
REMAINING_ITEMS = [H_ITEMS|T_ITEMS]
);
(
assertz(contains(H_LOCATIONS, H_ITEMS)),
REMAINING_LOCATIONS = T_LOCATIONS,
REMAINING_ITEMS = T_ITEMS
).
reset_world(LOCATION) :-
contains(LOCATION, ITEM),
retract(contains(LOCATION, ITEM)).
reset_world() :-
findall(Location, contains(Location, _), Locations),
maplist(reset_world, Locations).
generate(TERMINAL_LOCATION) :-
reset_world(),
findall(Location, location(Location), Locations),
random_permutation(Locations, Shuffled),
items(Items),
set_items(Shuffled, Items),
(
completable(TERMINAL_LOCATION),
!
);
generate().
generate() :-
terminal_location(Target),
generate(Target).