INDAPlus21 / INDAPlus21/eliased-prolog-task-10

Pass

Open
#1 0 comments 0 reactions 0 assignees View on GitHub
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.