Word puzzle — FLOWERS crossword
Fie următoarele șase cuvinte:
FLOWERS PROLOG ENTIRELY SCHOOL OREGANO SLEEP
Vom așeza cuvintele într-un puzzle tip cuvinte încrucișate — cinci cuvinte sunt pe orizontală, iar al șaselea este pe verticală. Coloana evidențiată a cuvântului vertical coincide cu câte o literă din fiecare cuvânt orizontal.
Pentru rezolvare:
- Implementați o bază de cunoștințe, definită prin predicatul
word/1. - Utilizați predicatul
string_chars/2, care primește un atom și returnează lista caracterelor conținute în atomul respectiv. - Definiți un predicat
list_pos/3care primește o listă, un index și returnează elementul de pe indexul dat dacă acesta există, șifalsealtfel.
Veți scrie un predicat principal
solution(W1, W2, W3, W4, W5, W6, L) :- ...
care se va asigura că cele șase cuvinte sunt cele din baza de cunoștințe și sunt mutual diferite, iar în L va întoarce o listă conținând soluția acestui puzzle.
Hint: cheia este că pozițiile intersecțiilor dintre cuvintele orizontale și cel vertical (W6) sunt fixate. Folosești
intersection(L1, L2, Pos1, Pos2)pentru a forța litera pe pozițiaPos1dinL1să fie egală cu litera pe pozițiaPos2dinL2.
Te-ai blocat?
editor
soluție
word(lovable).
word(energy).
word(savage).
word(whiskers).
word(agile).
word(purring).
word(flowers).
word(prolog).
word(entirely).
word(school).
word(oregano).
word(sleep).
list_pos([Result | _], Index, Index, Result) :- !.
list_pos([_ | T], CurrentIndex, Index, Result) :-
NewIndex is CurrentIndex + 1,
list_pos(T, NewIndex, Index, Result).
list_pos(List, Index, Result) :-
list_pos(List, 0, Index, Result).
all_different([]) :- !.
all_different([H | T]) :-
not(member(H, T)),
all_different(T).
string_chars_list([], []) :- !.
string_chars_list([HW | TW], [HL | TL]) :-
string_chars(HW, HL),
string_chars_list(TW, TL).
intersection(L1, L2, Pos1, Pos2) :-
list_pos(L1, Pos1, Intersection),
list_pos(L2, Pos2, Intersection).
extract_indices([], _, []) :- !.
extract_indices([HL | TL], [HI | TI], [HR | TR]) :-
list_pos(HL, HI, HR),
extract_indices(TL, TI, TR).
solution(W1, W2, W3, W4, W5, W6, L) :-
word(W1), word(W2), word(W3), word(W4), word(W5), word(W6),
all_different([W1, W2, W3, W4, W5, W6]),
string_chars_list([W1, W2, W3, W4, W5, W6], [L1, L2, L3, L4, L5, L6]),
intersection(L1, L6, 4, 0),
intersection(L2, L6, 5, 1),
intersection(L3, L6, 6, 2),
intersection(L4, L6, 6, 3),
intersection(L5, L6, 4, 4),
extract_indices([L1, L2, L3, L4, L5], [1, 2, 3, 3, 1], L), !.
?-
Tastează o interogare (ex. father_of(sandra, X).) și apasă Enter — sau apasă pe un caz de test de mai jos.
Cazuri de test (1 — apasă pe unul ca să îl rulezi, sau Verifică pentru toate)
?
solution(W1, W2, W3, W4, W5, W6, L).
așteptat: W1 = prolog, W2 = oregano, W3 = entirely, W4 = flowers, W5 = school, W6 = sleep, L = [r,r,t,l,o]