Вам действительно нужно преобразовать Истины в значения в Прологе? - PullRequest
1 голос
/ 08 ноября 2011

Я написал сортировку пузырьков в Прологе (код ниже). Это работает, но пахнет. Я довольно новичок в прологе. Вот проблемная часть:

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

Странно, мне нужно использовать эту функцию, чтобы преобразовать значение True в что-то (в данном случае []) и False в другое, чтобы использовать их. Нет ли более чистого пути?

% 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).

1 Ответ

4 голосов
/ 08 ноября 2011

Каждый вызов предиката либо завершается успешно (возможно, несколько раз), либо завершается неудачно.Если вы мыслите декларативно и действительно описываете, что такое отсортированный список, очень редко возникает необходимость явно представлять само значение истинности в программе.Скорее всего, было бы достаточно поместить вызов предиката, например, «восходящий (список)» в программе Prolog, чтобы описать случай отсортированного списка.Кажется, нет никакого преимущества вместо этого вызывать предикат типа «восходящий (список, T)», а затем использовать T для различения случаев.Почему бы не использовать неявное значение истинности самого предиката напрямую?Если вам действительно необходимо изменить значение истинности, вы можете, например, сделать это следующим образом, чтобы избежать вызова дважды по возрастанию / 1:

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

Обратите внимание, как для определения падежа используется правда возрастания / 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...