Basi c сравнение чисел в прологе? - PullRequest
0 голосов
/ 28 января 2020

В настоящее время я пытаюсь реализовать своего рода игру, основанную на Hilo, на прологе, в которой базовая функциональность c основана на установке секретного номера и на том, чтобы пользователь / программа угадали, что уйдет вперед " «Слишком низко» или «Слишком высоко».

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

int secret_number = 50;
int guess = Console.ReadLine();

if(guess < secret_number) Console.WriteLine("Too low!");
else if(guess > secret_number) Console.WriteLine("Too high!");
else Console.WriteLine("You found the secret number!");

Моя попытка Воспроизведение этого в Прологе было другим, но сейчас он сидит по адресу:

secret_number(85).

hilo(Guess):-
    Guess < secret_number, write("Too low!"),
    Guess > secret_number, write("Too high!"),
    write("You found the secret number!").

?-hilo(85).

Но любой, кто знаком с прологом, увидит, насколько это невероятно неправильно. Прежде всего, мы получаем ошибку Arithmeti c о том, что secret_number не является функцией. Чтобы противостоять этому, я попытался отправить secret_number в качестве аргумента, а не использовать его в качестве «глобальной» переменной (как я на это смотрю), но, похоже, это не сильно помогает. Кроме того, мы также получаем провал цели (директивы), но я думаю, что в этом случае это нечто само собой разумеющееся.

Я понимаю, что это очень просто c но, как я понимаю Мы все должны начать где-нибудь. Любая помощь и указатели приветствуются!

Ответы [ 2 ]

1 голос
/ 28 января 2020

Вы можете использовать предикат ISO сравнение / 3 и тот факт, что операторы сравнения являются просто атомами для сокращения вашего кода, например

message(<, 'too low').
message(>, 'too high').
message(=, 'found!').

hilo :-
  read(Guess),
  secret_number(Secret),
  compare(C, Guess, Secret),
  message(C, Msg),
  writeln(Msg).

В любом случае, если / то / иначе в ISO Prolog имеет следующую форму:

hilo(Guess):-
    secret_number(Secret),
    (  Guess < Secret
    -> write("Too low!")
    ;  Guess > Secret
    -> write("Too high!")
    ;  write("You found the secret number!")
    ).

Обратите внимание, что (потенциально дорогой) предикат secret_number / 1 вызывается только один раз ...

1 голос
/ 28 января 2020

Прежде всего, Пролог не делает if заявлений. Каждый предикат (то, что вы называете функцией) оценивает утверждения и пытается сделать их истинными. Если существует несколько возможных истин, вам нужно несколько предикатов. Предикаты также автономны. Вы не можете ожидать, что предикат будет знать, что находится в другом предикате. Вот более чистая версия вашего кода (я не тестировал его, не гарантирую, что он работает).

secret_number(85). %initialize secrete number to 85

hilo(Guess):-
    secret_number(Num), %secrete_number evaluates Guess to be 85
    Guess = Num,
    write("You found the secret number!").

%if your guess is incorrect, move on to a different predicates
hilo(Guess):-
    secret_number(Num),
    Guess < Num,
    write("Too low!").

%if the previous two predicates are both false, this one will be evaluated
hilo(Guess):-
    secret_number(Num),
    Guess > Num,
    write("Too high!").

Затем вам нужно написать запрос в окне запроса:

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