Присвоение параметра большему из двух чисел - PullRequest
2 голосов
/ 05 января 2012

Я написал следующую рекурсивную функцию для назначения параметра большему из двух чисел:

max(A,B,X) :-   
    A >= B,
    X is A.

max(A,B,X) :-
    max(B,A,X).

Это работает, как и ожидалось, но, как новичок в Прологе, я не решаюсь полагать, что это самое эффективное решение. Есть ли лучший способ сделать это?

Кроме того, нажмите «;» после вызова функция повторяется снова. Это правильное поведение?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 06 января 2012

Почему бы вам не использовать встроенную арифметическую функцию "max"? Z является максимальным (X, Y). Или используйте ограничения, если вы хотите использовать предикат и в других направлениях.

4 голосов
/ 05 января 2012

Это кажется мне запутанным. Попробуйте что-то вроде

max(A,B,A) :- A >  B .
max(A,B,B) :- A =< B .

Хотя, возможно, вы захотите добавить проверку типа.

[отредактировано, чтобы убрать необходимость вырезания и обеспечить лучшую поддержку для предварительно созданного третьего параметра.]

Другой вариант, конечно, может выглядеть примерно так:

max(A,B,M) :- A > B -> M=A ; M=B .

Это выдаст ошибку, если A или B не связаны, тогда как первый пример будет работать независимо от того, как он вызывается (до тех пор, пока создается 2 аргумента). Например, вызывая его как

max(A,3,5).

выход X=5.

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