come contare tutti i numeri in una lista

per favore aiutami con come contare anche i numeri in una lista in Prolog. sono un principiante, appena iniziato ad imparare Prolog ieri. so di contare gli elementi nella lista è

mylen([H|Lc],N) :- mylen(Lc,M),N is M+1.
mylen([],0).

e penso che definire anche il numero forse utile in questo caso, e credo che il codice è forse qualcosa di simile:

even(n):-
  N rem 2 =:= 0.

potete aiutarmi a mettere queste due parti insieme, così il mio codice conta anche i numeri? so che devo anche aggiungere un contatore, ma non ho idea di come farlo in Prolog.

grazie mille per il vostro aiuto!

EN From: How to count all even numbers in a list

More similar articles:

7 Comments

  1. even(N) :- N rem 2 =:= 0. sarà vero se N è pari. cercate di descrivere il vostro predicato più chiaramente. per esempio, una lista vuota non ha nemmeno numeri è mylen([], 0). E si potrebbe avere un’altra regola che dice, Una lista, [H|T], ha N anche numeri se H è pari, T ha N1 anche numeri, e N è N1 + 1. oppure, A list, [H|T], ha N numeri pari se H è dispari, e T ha N numeri pari.

  2. non è una dichiarazione if, di per sé. quando si scrive una regola predicata come foo(X,Y) :- bar(X), bah(Y). significa, foo(X,Y) è vero se bar(X) è vero e bah(Y) è vero. il predicato, mylen([H|Lc],N) :- mylen(Lc,M),N is M+1. significa che la lunghezza di [H|Lc] è N se la lunghezza di Lc è M e N è M+1.

  3. attualmente, avete due regole:

    (1) Il numero di elementi nella lista vuota è 0

    my_len([], 0).

    (2) Il numero di elementi nella lista [H|Lc] è N se il numero di elementi nella lista Lc è M e N è M+1

    my_len([H|Lc], N) :- my_len(Lc, M), N is M+1.

    sei già armato di un predicato che è vero se un numero è pari, e falso se non lo è: N è anche se il resto di N quando diviso per 2 è 0:

    even(N) :- N rem 2 =:= 0.

    ora si può mettere insieme. il numero di elementi pari in una lista vuota è ancora zero. così si mantiene la regola (1). la tua regola (2) dovrà cambiare in quanto dovrà controllare se la testa della lista è pari. è possibile farlo con due regole in Prolog che si prendono cura dei due casi diversi (la testa della lista è pari, o la testa della lista è dispari):

    (2a) Il numero di elementi pari nella lista [H|Lc] è N se H è pari, e il numero di elementi pari nella lista Lc è M, e N è M+1.

    (2B) Il numero di elementi pari nella lista [H|Lc] è N se H non è pari (o H è dispari), e il numero di elementi pari nella lista Lc è N. [notare che N non cambia se H è dispari.]

    lascio il rendering di queste due regole in Prolog come un esercizio. è possibile utilizzare il funzionario negazione Prolog, \+ per verificare se un numero non è nemmeno, da \+ even(N). oppure si può definire un predicato odd(N) :- N rem 2 =:= 1. da usare per quel caso.

    1. 1Grazie mille per il vostro aiuto. cercherò di finire gli esercizi. grazie ancora!. e ‘stato molto utile!

  4. se il vostro sistema Prolog offre , potete usare tcount/3 in combinazione con even_truth/2. ecco come:

    ?- tcount(even_truth, [1,2,3,5,7,9,10], N_even).
    N_even = 2.
    

    entrambi i predicati (tcount/3 e even_truth/2) sono monotoni e conservano ! questo li rende molto robusti e consente di ottenere sempre risposte sonore logicamente.

    considerare la seguente query più generale:

    ?- Xs = [_,_,_], tcount(even_truth, Xs, N_even).
    Xs = [_A,_B,_C], N_even = 0, _A mod 2 #= 1, _B mod 2 #= 1, _C mod 2 #= 1 ;
    Xs = [_A,_B,_C], N_even = 1, _A mod 2 #= 1, _B mod 2 #= 1, _C mod 2 #= 0 ;
    Xs = [_A,_B,_C], N_even = 1, _A mod 2 #= 1, _B mod 2 #= 0, _C mod 2 #= 1 ;
    Xs = [_A,_B,_C], N_even = 2, _A mod 2 #= 1, _B mod 2 #= 0, _C mod 2 #= 0 ;
    Xs = [_A,_B,_C], N_even = 1, _A mod 2 #= 0, _B mod 2 #= 1, _C mod 2 #= 1 ;
    Xs = [_A,_B,_C], N_even = 2, _A mod 2 #= 0, _B mod 2 #= 1, _C mod 2 #= 0 ;
    Xs = [_A,_B,_C], N_even = 2, _A mod 2 #= 0, _B mod 2 #= 0, _C mod 2 #= 1 ;
    Xs = [_A,_B,_C], N_even = 3, _A mod 2 #= 0, _B mod 2 #= 0, _C mod 2 #= 0.

Leave a Reply

Your email address will not be published. Required fields are marked *