| 1 | |
|---|
| 2 | :- object(bridge, |
|---|
| 3 | instantiates(heuristic_state_space)). |
|---|
| 4 | |
|---|
| 5 | |
|---|
| 6 | :- info([ |
|---|
| 7 | version is 1.1, |
|---|
| 8 | author is 'Paulo Moura', |
|---|
| 9 | date is 2004/8/15, |
|---|
| 10 | comment is 'Bridge puzzle.']). |
|---|
| 11 | |
|---|
| 12 | |
|---|
| 13 | :- uses(list, [append/3]). |
|---|
| 14 | :- uses(numberlist, [min/2, max/2]). |
|---|
| 15 | :- uses(set, [insert/3, insert_all/3, select/3]). |
|---|
| 16 | |
|---|
| 17 | |
|---|
| 18 | initial_state(start, ([], right, [1,3,6,8,12])). |
|---|
| 19 | |
|---|
| 20 | |
|---|
| 21 | goal_state(end, ([1,3,6,8,12], left, [])). |
|---|
| 22 | |
|---|
| 23 | |
|---|
| 24 | next_state((Left1, left, Right1), (Left2, right, Right2), Slower) :- % two persons |
|---|
| 25 | append(List, [Person1| Persons], Left1), |
|---|
| 26 | select(Person2, Persons, Others), |
|---|
| 27 | append(List, Others, Left2), |
|---|
| 28 | insert_all([Person1, Person2], Right1, Right2), |
|---|
| 29 | (Person1 > Person2 -> |
|---|
| 30 | Slower = Person1 |
|---|
| 31 | ; |
|---|
| 32 | Slower = Person2). |
|---|
| 33 | |
|---|
| 34 | next_state((Left1, right, Right1), (Left2, left, Right2), Slower) :- % two persons |
|---|
| 35 | append(List, [Person1| Persons], Right1), |
|---|
| 36 | select(Person2, Persons, Others), |
|---|
| 37 | append(List, Others, Right2), |
|---|
| 38 | insert_all([Person1, Person2], Left1, Left2), |
|---|
| 39 | (Person1 > Person2 -> |
|---|
| 40 | Slower = Person1 |
|---|
| 41 | ; |
|---|
| 42 | Slower = Person2). |
|---|
| 43 | |
|---|
| 44 | next_state((Left1, left, Right1), (Left2, right, Right2), Person) :- % one person |
|---|
| 45 | select(Person, Left1, Left2), |
|---|
| 46 | insert(Right1, Person, Right2). |
|---|
| 47 | |
|---|
| 48 | next_state((Left1, right, Right1), (Left2, left, Right2), Person) :- % one person |
|---|
| 49 | select(Person, Right1, Right2), |
|---|
| 50 | insert(Left1, Person, Left2). |
|---|
| 51 | |
|---|
| 52 | |
|---|
| 53 | heuristic((Left, Lamp, Right), Heuristic) :- |
|---|
| 54 | Lamp = left -> |
|---|
| 55 | list::min(Left, Heuristic) |
|---|
| 56 | ; |
|---|
| 57 | list::max(Right, Max), |
|---|
| 58 | list::min(Right, Min), |
|---|
| 59 | Heuristic is Max + Min. |
|---|
| 60 | |
|---|
| 61 | |
|---|
| 62 | print_state((Left, Lamp, Right)) :- |
|---|
| 63 | write_list(Left), |
|---|
| 64 | (Lamp = left -> |
|---|
| 65 | write(' lamp _|____________|_ ') |
|---|
| 66 | ; |
|---|
| 67 | write(' _|____________|_ lamp ')), |
|---|
| 68 | write_list(Right), |
|---|
| 69 | nl. |
|---|
| 70 | |
|---|
| 71 | |
|---|
| 72 | write_list([]). |
|---|
| 73 | |
|---|
| 74 | write_list([Head| Tail]) :- |
|---|
| 75 | write(Head), write(' '), |
|---|
| 76 | write_list(Tail). |
|---|
| 77 | |
|---|
| 78 | |
|---|
| 79 | :- end_object. |
|---|