Пролог - поиск минимального элемента в списке - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь найти минимальный элемент в списке при сравнении квадратов. Я сделал следующее:

min_elem([Min],Min).
min_elem([Head | Tail], Min) :-
   min_elem(Tail, Tail_min),
   Min is min(Head ^ 2, Tail_min ^ 2).

На самом деле это работало с несколькими тестами, но я заметил, что при трассировке следующего теста:

Пример трассировки

Так что после проверки квадрата он будет использовать предыдущий. То есть, когда 8 ^ 2 переходит в 64, а затем 64 ^ 2. Как я могу предотвратить это? ? Спасибо !!!

1 Ответ

1 голос
/ 21 октября 2019

Если я вас правильно понимаю, вы хотите, чтобы min_elem(XS,X) было истинным, если X - это минимум квадратов в XS.

Исходя из этого понимания, есть две проблемы:

  1. В вашем базовом случае вы не берете квадрат.

  2. В вашем рекурсивном случае вы берете квадрат минимума квадратовв хвосте.

Чтобы устранить эти проблемы, возведите в минимум минимальное значение в базовом случае и уберите квадратное значение в рекурсивном случае:

min_elem([X],Min) :- Min is X ^ 2.
min_elem([Head | Tail], Min) :-
   min_elem(Tail, Tail_min),
   Min is min(Head ^ 2, Tail_min).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...