¿Realmente necesitas convertir Verdades en valores en Prolog?

Escribí un tipo de burbuja en Prolog (código a continuación). Funciona pero huele. Soy bastante nuevo en prolog. Aquí está la parte problemática:

% Problem: convert the true value to something
% I can actually use.
sorted_value(X,X) :- sorted(X).
sorted_value(X,[]) :- not(sorted(X)).

Es extraño que necesite usar esta función para convertir un valor True en algo (en este caso, []) y False en otra cosa para poder usarlos. ¿No hay una forma más limpia?

% Bubble Sort a list.

% is the list sorted?
sorted([]).
sorted([Head|[]]).
sorted([First|[Second|Rest]]) :-
  min(First,Second,First),
  sorted([Second|Rest]).

% swap all pairs in the list that
% needs to be swapped
bubble_sort_list([], []).
bubble_sort_list([Head|[]],[Head]).
bubble_sort_list([First|[Second|Rest]], [One|Solution]) :-
  min(First,Second, One),
  max(First,Second,Two),
  bubble_sort_list([Two|Rest],Solution).

% Problem: convert the true value to something
% I can actually use.
sorted_value(X,X) :- sorted(X).
sorted_value(X,[]) :- not(sorted(X)).

% Repeatedly call bubble_sort until
% the list is sorted
bubble_sort_helper([],List, Solution) :-
  bubble_sort_list(List, SortedList),
  sorted_value(SortedList, Value),
  bubble_sort_helper(Value,SortedList, Solution).
bubble_sort_helper(A,List,List).

% this is what you call.
buuble_sort(List,Solution) :-
  bubble_sort_helper([],List,Solution).

preguntado el 08 de noviembre de 11 a las 08:11

1 Respuestas

Cada llamada de predicado tiene éxito (posiblemente varias veces) o falla. Si piensa de manera declarativa y realmente describe lo que es una lista ordenada, solo en raras ocasiones parecerá que es necesario representar explícitamente el valor de verdad en sí mismo en un programa. Más bien, normalmente sería suficiente colocar una llamada de predicado como "ascendente (Lista)" en un programa Prolog para describir el caso de una lista ordenada. Parece que no hay ninguna ventaja para llamar a un predicado como "ascendente (Lista, T)" y luego usar T para distinguir los casos. ¿Por qué no utilizar directamente el valor de verdad implícito del predicado mismo? Si realmente necesita cosificar el valor de verdad, puede, por ejemplo, hacerlo así para evitar llamar a ascendente / 1 dos veces:

ascending(Ls, T) :- 
    (   ascending(Ls) -> T = true
    ;   T = false
    ).

Observe cómo se usa la verdad de ascendente / 1 para distinguir los casos.

respondido 08 nov., 11:13

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.