Проблема с форматом печати в Прологе - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть следующий код:

everything:-give_birth(X), give_eggs(Y),
    format('Animal Name: \t~w,  \tGives Birth', X), nl,  
    format('Animal Name: \t~w,  \tGives egg', Y), nl,fail.

, и это вывод:

Animal Name:    cheetah,    Gives Birth
Animal Name:    ostrich,    Gives egg
Animal Name:    cheetah,    Gives Birth
Animal Name:    penguin,    Gives egg
Animal Name:    cheetah,    Gives Birth
Animal Name:    albatross,  Gives egg
Animal Name:    tiger,  Gives Birth
Animal Name:    ostrich,    Gives egg
Animal Name:    tiger,  Gives Birth
Animal Name:    penguin,    Gives egg
Animal Name:    tiger,  Gives Birth
Animal Name:    albatross,  Gives egg
Animal Name:    giraffe,    Gives Birth
Animal Name:    ostrich,    Gives egg
Animal Name:    giraffe,    Gives Birth
Animal Name:    penguin,    Gives egg
Animal Name:    giraffe,    Gives Birth
Animal Name:    albatross,  Gives egg
Animal Name:    zebra,  Gives Birth
Animal Name:    ostrich,    Gives egg
Animal Name:    zebra,  Gives Birth
Animal Name:    penguin,    Gives egg
Animal Name:    zebra,  Gives Birth
Animal Name:    albatross,  Gives egg

Первая проблема: я хочу, чтобы третий столбец был выровнен.

Вторая проблема: вывод не тот, который я хочу, я хочу, чтобы он сначала напечатал всех животных, которые рожают, которых только 4 (остальные повторяются в этом выводе, я не знаю почему).а затем остальные животные, которые дают яйцо.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Я хочу выровнять третий столбец.

Обычно я не использую format / 2 с Prolog, потому что концепция вкладок просто сводит меня с умаорехи.Также я использую Prolog в основном для решения проблем ИИ, а не для пользовательского интерфейса, поэтому я привык читать и создавать вложенные структуры.

Это не лучший ответ о том, как использовать format/2 для выравнивания кода, но это работает.

everything_3 :-
    give_birth(X),
    give_eggs(Y),
    format('~s~t~14|~s~t~25|~s~t~25|~n', ['Animal Name: ',X,'Gives Birth']),
    format('~s~t~14|~s~t~25|~s~t~25|~n', ['Animal Name: ',Y,'Gives egg']),
    fail.

с

give_birth(cheetah).
give_birth(tiger).
give_birth(zebra).
give_eggs(ostrich).

?- everything_3.
Animal Name:  cheetah    Gives Birth
Animal Name:  ostrich    Gives egg
Animal Name:  tiger      Gives Birth
Animal Name:  ostrich    Gives egg
Animal Name:  zebra      Gives Birth
Animal Name:  ostrich    Gives egg
false.

Сначала напечатать всех животных, которые рожают только 4 (остальные повторяются в этом выводе, я не знаю почему),а затем остальные животные, которые дают яйцо.

Когда я пишу это, Пауло Моура только что опубликовал эту часть ответа , который является тем же ответом, который я планировал дать,использование отказоустойчивого цикла с предикатом из трех предложений.

everything :-
    give_birth(X),
    format('Animal Name: \t~w,  \tGives Birth', X), nl,
    fail.
everything :-
    give_eggs(Y),
    format('Animal Name: \t~w,  \tGives egg', Y), nl,
    fail.
everything.

Вот два ответа в сочетании с примером выполнения.

everything_4 :-
    give_birth(X),
    format('~s~t~14|~s~t~25|~s~t~25|~n', ['Animal Name: ',X,'Gives Birth']),
    fail.

everything_4 :-
    give_eggs(Y),
    format('~s~t~14|~s~t~25|~s~t~25|~n', ['Animal Name: ',Y,'Gives egg']),
    fail.

everything_4.

?- everything_4.
Animal Name:  cheetah    Gives Birth
Animal Name:  tiger      Gives Birth
Animal Name:  zebra      Gives Birth
Animal Name:  ostrich    Gives egg
true.
0 голосов
/ 22 ноября 2018

Что касается второй проблемы, попробуйте:

everything :-
    give_birth(X),
    format('Animal Name: \t~w,  \tGives Birth', X), nl,
    fail.
everything :-
    give_eggs(Y),
    format('Animal Name: \t~w,  \tGives egg', Y), nl,
    fail.
everything.

Этот код напечатает сначала всех животных, которые рожают, затем всех животных, которые дают яйца.Он использует обычно называемый отказоустойчивый цикл .Вызов fail/0 в первом предложении приводит к возврату ко всем решениям для предиката give_birth /1.Аналогично для второго пункта.Последнее предложение просто делает вызов предиката everything/0 успешным после печати информации для всех животных.

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