Легко увидеть ошибку, если идти шаг за шагом. Но вы, вероятно, уже пробовали это, поэтому я не буду пытаться повторить то, что вы уже сделали.
Но да, правила имеют приоритет, но нет, этот приоритет не таков, как вы думаете. Я очень стараюсь понять, что эти первые две строки делают в твоей голове, но это слишком сложно для меня. Но если вы просто запустите программу или отследите ее, вы сможете увидеть, что она делает на компьютере, и попытаться сравнить и сравнить с тем, что она делает в вашей голове.
Но для решения этой проблемы у вас должно быть два разных предиката, а не только один предикат.
Один предикат - получить минимум из двух вещей.
Второй предикат состоит в том, чтобы свести список к минимуму из множества вещей, применяя первый предикат к первому и второму, затем к минимуму мин первого и второго и третьего, вот так:
min([x0, x1, x2, ...) = min(min(min....(x0, x1), x2), ...)
Но первая минута не вторая минута. В Прологе первая минута - это арифметическая функция.
?- X is min(1, 2).
X = 1.
И min([1,2,3], X)
будет успешным, если X is min(min(1, 2), 3)
. И, возможно, сбой, если нет.
Как написать min, чтобы сделать список в min(min(min(...)))
? хороший вопрос Я нахожу в SWI очень хороший предикат foldl
, поэтому я не уменьшаю себя, но вы можете написать сокращение, если не хотите уменьшать с помощью foldl.
min([H|T], Min) :- foldl(min, T, H, Min).
min(A, B, Min) :- Min is min(A, B).
Так много минут ... может быть, слишком много минут? Я не знаю. Вы должны лучше знать в своей голове, сколько минут слишком много минут. Может быть, слишком много в этом коде?