www what visit versiones swi swf programming portable org descargar code and prolog processing-efficiency

what - Prolog: eficiencia



visit http www swi prolog org (2)

¿Hay alguna manera en prolog de acortar lo siguiente?

rule(prop, [1/2,2/2]). rule(prop, [1/3,2/3,3/3]). rule(prop, [1/4,2/4,3/4,4/4]). rule(prop, [1/5,2/5,3/5,4/5,5/5]). rule(prop, [1/6,2/6,3/6,4/6,5/6,6/6]). rule(prop, [1/7,2/7,3/7,4/7,5/7,6/7,7/7]).


El siguiente código no es necesariamente "más corto" para el caso de 6 reglas diferentes, pero es más escalable, que es probablemente lo que realmente quiere decir.

Puede dividir esto de la siguiente manera. Primero, una regla que genera una lista:

list_props(N, N, [N/N]). list_props(X, N, [X/N|T]) :- X >= 1, X < N, X1 is X + 1, list_props(X1, N, T).

Cuando llamas esto, genera una lista de proporciones desde el primer argumento hasta el último, siendo el último argumento el denominador. Por ejemplo:

| ?- list_props(1, 4, L). L = [1/4,2/4,3/4,4/4] ? a | ?-

Tenga en cuenta que podría exigir que N sea ​​un entero> = 1 con integer(N) y condiciones, pero estaba siendo breve y no hice eso en lo anterior.

Puede usar esto en su predicado de nivel superior:

rule(prop, L) :- between(2, 7, X), list_props(1, X, L).

Cuyos rendimientos:

| ?- rule(prop, L). L = [1/2,2/2] ? ; L = [1/3,2/3,3/3] ? ; L = [1/4,2/4,3/4,4/4] ? ; L = [1/5,2/5,3/5,4/5,5/5] ? ; L = [1/6,2/6,3/6,4/6,5/6,6/6] ? ; L = [1/7,2/7,3/7,4/7,5/7,6/7,7/7] ? ; (2 ms) no | ?-


TL; DR: ¿Por qué no delegar la responsabilidad de manejar la recursión y hacer las cosas bien también?

Esta respuesta da seguimiento a esta respuesta previa de @lurker. No cubrimos toda la pregunta, sino que nos centramos en mostrar cómo se puede definir un predicado como list_props/3 para que toda recursión se delegue en los predicados de Prolog probados y verdaderos length/2 , numlist/2 y maplist/3 :

:- use_module(library(between), [numlist/2]). :- use_module(library(lists), [maplist/3]).

Para personalizar la versátil lista de meta predicados maplist/3 definimos:

denom_num_expr(B, A, A/B).

Consulta de muestra usando sicstus-prolog 4.3.2:

| ?- length(_Ds, N), numlist(N, _Ds), maplist(denom_num_expr(N), _Ds, Qs). N = 1, Qs = [1/1] ? ; N = 2, Qs = [1/2,2/2] ? ; N = 3, Qs = [1/3,2/3,3/3] ? ; N = 4, Qs = [1/4,2/4,3/4,4/4] ? ; N = 5, Qs = [1/5,2/5,3/5,4/5,5/5] ? ; N = 6, Qs = [1/6,2/6,3/6,4/6,5/6,6/6] ? ; N = 7, Qs = [1/7,2/7,3/7,4/7,5/7,6/7,7/7] ? ; N = 8, Qs = [1/8,2/8,3/8,4/8,5/8,6/8,7/8,8/8] ? ; N = 9, Qs = [1/9,2/9,3/9,4/9,5/9,6/9,7/9,8/9,9/9] ? ...