Prolog, jak ugryźć ?

0

Cześć wszystkim
Znajdzie się dobra dusza która pomoże mi z następującym zadaniem?

Zdefiniuj regułę przetłumacz(Lista1, Lista2), która zamienia cyfry od 0 do 9 na ich słowną reprezentację np. 
? – przetłumacz([3,0,5], Lista). 
Lista=[trzy, zero, pięć]. 
? – przetłumacz([3,0,5], [trzy, zero, pięć].). 
yes 
Wykorzystaj fakty: 
znaczy(0, zero). znaczy(1, jeden). … znaczy(9,dziewiec).

Dziękuje z góry za wszelka pomoc ;)

1

Zastanówmy się po kolei:

  1. To co próbujemy uzyskać to jest dokładnie to samo co:

     przetłumacz(L1, L2) :- maplist(znaczy, L1, L2).
    

    jeśli możesz to zapisać tak, to już mamy rozwiązanie.

  2. Zakładam, że jednak nie, więc musimy się zastanowić co maplist/3 robi. Działanie tej funkcji jest podobne do zapisu l2 = l1.map { |e| znaczy(e) } w Ruby lub l2 = [znaczy(e) for e in l1] w Pythonie (nie powiedziałeś jakie języki znasz, więc mam nadzieję, że rozumiesz zapis któregoś z tych języków).

  3. Spróbujmy zapisać to w Prologu:

    • dla pustej listy zwracamy pustą listę: przetłumacz([], []).
    • dla niepustej listy musimy przetworzyć pierwszy element używając funkcji i połączyć to z rekurencyjnym wywołaniem funkcji na ogonach list: przetłumacz([X | Xs], [Y | Ys]) :- znaczy(X, Y), przetłumacz(Xs, Ys).

Tyle.

Jeśli chodzi o uczelnię to polecam nauczyć się pisać funkcje wyższego rzędu (takie, które przyjmują funkcję jako argument) z użyciem call/2. Mnie to uratowało mocno na egzaminie.

0

Dziękuję za odpowiedź, nie bardzo jednak rozumiem zapis w prologu, możesz mi go objaśnić ? dziękuję z góry

0

No to mam taki zapis w prologu:

znaczy(0, zero).
znaczy(1, jeden).
znaczy(2, dwa).
znaczy(3, trzy).
znaczy(4, cztery).
znaczy(5, pięć).
znaczy(6, sześć).
znaczy(7, siedem).
znaczy(8, osiem).
znaczy(9, dziewięć).

przetłumacz([X | Xs], [Y, Ys]) :- znaczy(X, Y), przetłumacz(Xs, Ys).

Ładuje to do głównego okna i wpisuje:

?- przetłumacz([3,0,5],Lista).

Lub jakiekolwiek inne liczby zawsze dostaję wynik FALSE, a nie Lista=[trzy,zero,pięć].

O co tu jeszcze chodzi? Gdzie czegoś brakuje ?

0

Objaśni mi to ktoś ?

0

brakuje obsłużenia bazowego przypadku, tutaj jest wyjaśnione mapowanie https://www.cl.cam.ac.uk/teaching/2001/PrologAI/PLVol3.ppt

przetłumacz([], []).
...

:- przetłumacz([3,0,5,1], L), write(L).
[trzy,zero,pięć,jeden]
0

Przecież w tamtym poście było wszystko opisane.

1 użytkowników online, w tym zalogowanych: 0, gości: 1