una prologo partes libro hacer elementos ejemplo cuento como caracteristicas antologia lambda prolog logic

lambda - partes - prologo de un libro



contando el número de un elemento en particular en una lista de prólogos (3)

Necesita hacer que sus cláusulas sean mutuamente excluyentes, la segunda cláusula tendrá éxito donde la primera lo haga.

En cuanto a su error, se trata del flujo de información. Necesitas intercambiar las líneas en tu primera cláusula así:

rate(X,[H|T],N):- X == H, rate(X,T,N1), N is N1+1.

Sin embargo, este cambio hará que tu predicado no sea ​​recursivo en la cola. Para ser recursivo de cola, necesita pasar información a lo largo de la cadena de llamadas, no volver a recibirla en el camino ascendente como lo hace ahora:

rate(X,[H|T],N):- X == H, N1 is N+1, rate(X,T,N1).

Ahora puede ver que no recibe el valor final aquí, sino que especifica el valor inicial. Cuando llegamos al caso base tenemos nuestro resultado:

rate(X, [], N).

aquí N es el resultado. Cómo recuperarlo? Use argumentos adicionales, una variable desinstalada, para unificarlos con este resultado cuando hayamos llegado al final:

rate(X, [], N, V) :- V is N.

Ahora la cláusula recursiva debe acomodarse a esta variable, pasándola sin cambios a lo largo de la cadena de llamadas.

Estoy tratando de contar cuántas veces aparece un elemento en una lista, hasta ahora he llegado con

rate(X,[H|T],N):- X == H, N is N+1, rate(X,T,N). rate(X,[_|T],N) :- rate(X,T,N). rate(_,[],N) :- N is 0.

He cubierto cuando se encuentra la coincidencia, cuando no hay coincidencia y cuando llega al final de la lista. Pero cuando pruebo, obtengo

43 ?- rate(4,[4,2,3,4,4,2],X). ERROR: is/2: Arguments are not sufficiently instantiated Exception: (6) frequency(4, [4, 2, 3, 4, 4, 2], _G393) ?

¿Qué argumentos me estoy perdiendo exactamente?


Puede usar is/2 (como en N is X ) si y solo si X es un número. No puedes usar is/2 si X es una variable libre. En tu primera cláusula tienes: N is N+1 . Esto es malo, ya que N es una variable libre (no tiene un valor en este punto, y también lo es para N + 1).

Hay otro error En:

rate(X,[_|T],N) :- rate(X,T,N).

ya que usa esto SOLAMENTE cuando X no es el primer elemento en la lista, ¡debe verificar que esto sea cierto! Aquí está el código:

count(_, [], 0) :- !. /* empty list, base case */ count(X, [X|T], N) :- /* if X is in the head of the list */ count(X, T, N2), /* count on the tail (let this N2) */ N is N2 + 1. /* and N is N2 + 1 */ count(X, [Y|T], N) :- X /= Y, /* if X is not in the head */ count(X, T, N). /* just count the rest */


Si le gusta el estilo funcional, puede escribirlo con SWI Prolog:

:- use_module(library(lambda)). rate(X,L,N) :- foldl(/Y^V0^V1^((X = Y->V1 is V0+1; V1 = V0)), L, 0, N).