INDAPlus21 / INDAPlus21/eliased-prolog-task-10
Pass
- Dominant language
- Prolog
- Stars
- 0
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Description
**Very well done Elias!**
I'm all for abstractions, as long as you use all abstractions.
_Your spagetti_:
```prolog
sum(X, Y) :-
S is X+Y,
write(S).
% ...
is_w(Row, Column, Board) :-
nth1_2d(Row, Column, Board, Stone),
Stone=w.
is_b(Row, Column, Board) :-
nth1_2d(Row, Column, Board, Stone),
Stone=b.
```
I think you have overcomplicated things. For example, `is_adjacent_e` can be removed, together with some other structures.
_Your code_:
```prolog
is_adjacent_e(Row, Column, Board) :-
(
R is Row+1,
(
R<9, Column<9
-> is_e(R, Column, Board)
; false
);
C is Column+1,
(
Row<9, C<9
-> is_e(Row, C, Board)
; false
);
Ro is Row-1,
(
Ro<9, Column<9
-> is_e(Ro, Column, Board)
; false
);
Co is Column-1,
(
Row<9, Co<9
-> is_e(Row, Co, Board)
; false
)
).
supportive_adjacent(Row, Column, Board, Stone_color, Adjancent_white) :-
(
Row<9, Column<9
-> (
is_color(Row, Column, Board, Stone_color)
-> (
is_adjacent_e(Row, Column, Board)
-> stop(0)
; (
\+ member([Row, Column], Adjancent_white)
-> append(Adjancent_white, [[Row, Column]], New_list),
real_adjancent_of_color(Row, Column, Board, Stone_color, New_list)
)
)
)
).
real_adjancent_of_color(Row, Column, Board, Stone_color, Adjancent_white) :-
(
supportive_adjacent(Row, Column, Board, Stone_color, Adjancent_white);
R is Row+1,
supportive_adjacent(R, Column, Board, Stone_color, Adjancent_white);
C is Column+1,
supportive_adjacent(Row, C, Board, Stone_color, Adjancent_white);
Ro is Row-1,
supportive_adjacent(Ro, Column, Board, Stone_color, Adjancent_white);
Co is Column-1,
supportive_adjacent(Row, Co, Board, Stone_color, Adjancent_white)
).
```
_Without `is_adjacent_e`_:
```prolog
supportive_adjacent(Row, Column, Board, Stone_color, Adjancent_white) :-
(
Row<9, Column<9
-> (
is_e(Row, Column, Board)
-> stop(0)
; (
is_color(Row, Column, Board, Stone_color)
-> (
\+ member([Row, Column], Adjancent_white)
-> append(Adjancent_white, [[Row, Column]], New_list),
real_adjancent_of_color(Row, Column, Board, Stone_color, New_list)
)
)
)
).
real_adjancent_of_color(Row, Column, Board, Stone_color, Adjancent_white) :-
(
supportive_adjacent(Row, Column, Board, Stone_color, Adjancent_white);
R is Row+1,
supportive_adjacent(R, Column, Board, Stone_color, Adjancent_white);
C is Column+1,
supportive_adjacent(Row, C, Board, Stone_color, Adjancent_white);
Ro is Row-1,
supportive_adjacent(Ro, Column, Board, Stone_color, Adjancent_white);
Co is Column-1,
supportive_adjacent(Row, Co, Board, Stone_color, Adjancent_white)
).
```
_Without the `->` control structure_:
```prolog
supportive_adjacent(Row, Column, Board, Stone_color, Adjancent_white) :-
Row<9, Column<9,
(
is_e(Row, Column, Board);
(
is_color(Row, Column, Board, Stone_color),
\+ member([Row, Column], Adjancent_white),
append(Adjancent_white, [[Row, Column]], New_list),
real_adjancent_of_color(Row, Column, Board, Stone_color, New_list)
)
).
real_adjancent_of_color(Row, Column, Board, Stone_color, Adjancent_white) :-
(
supportive_adjacent(Row, Column, Board, Stone_color, Adjancent_white);
R is Row+1,
supportive_adjacent(R, Column, Board, Stone_color, Adjancent_white);
C is Column+1,
supportive_adjacent(Row, C, Board, Stone_color, Adjancent_white);
Ro is Row-1,
supportive_adjacent(Ro, Column, Board, Stone_color, Adjancent_white);
Co is Column-1,
supportive_adjacent(Row, Co, Board, Stone_color, Adjancent_white)
).
```
_With logical expressions as arguments_:
```prolog
supportive_adjacent(Row, Column, Board, Stone_color, Adjancent_white) :-
Row<9, Column<9,
(
is_e(Row, Column, Board);
(
is_color(Row, Column, Board, Stone_color),
\+ member([Row, Column], Adjancent_white),
append(Adjancent_white, [[Row, Column]], New_list),
real_adjancent_of_color(Row, Column, Board, Stone_color, New_list)
)
).
real_adjancent_of_color(Row, Column, Board, Stone_color, Adjancent_white) :-
R is Row+1, Ro is Row-1,
C is Column+1, Co is Column-1,
(
(X = Column, Y = Row); (X = C, Y = Row); (X = Co, Y = Row); (X = Column, Y = R); (X = Column, Y = Ro)
),
supportive_adjacent(Y, X, Board, Stone_color, Adjancent_white).
```
Thanks for your hard work!
Educational read: https://www.metalevel.at/prolog/fun
Contributor guide
No contributing guide indexed for this repository
Research direction
Start by locating the definitions of supportive_adjacent/5 and real_adjancent_of_color/5 shown in the issue. Compare the successive examples, then verify that the adjacency and recursive color-support behavior remains unchanged after simplifying the control structures; no test file is named.
Written by the indexing model from the issue text.
Assessment
- Domain
- backend
- Issue type
- Refactor
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100