Как написать код, похожий на операторы-переключатели в Прологе - PullRequest
0 голосов
/ 27 января 2020

Я сейчас пытаюсь написать программу на Прологе, которая печатает таблицу типа

x    x      x       x   
x    x      x       x
x    x      x       x
5    6      7       8
x    x      x       x
x    x      x       x
x    x      x       x
1    2      3       4

Вы можете себе представить, что в супермаркете есть полки, а x s - пустые полки и полки которым есть товар, присваивается номер. Таким образом, 1 представляет полку с идентификатором шельфа 1, 6 - это полку с идентификатором шельфа 6 et c

Я хочу написать функцию, которая выполняет итерацию по массиву, в котором хранятся все местоположения полок и ShelID, и печатает ShelID. Если это пустая полка без идентификатора, ее следует распечатать как x, как показано выше.

Программа успешно распечатывает идентификатор полки при точном совпадении, но не обрабатывает сценарий случая ios, где полка пуста и не имеет идентификатора.

Как мне это сделать?

Я уже проверил обучающее видео https://www.youtube.com/watch?v=SykxWpFwMGs&t=352s и еще одну публикацию переполнения стека 'if' в прологе? , но они, похоже, неприменимы в моем случае, потому что это включает в себя более 2 возможностей (при печати строки (5, 6, 7, 8), строки (1, 2, 3, 4), и строки, которые печатают (х, х, х, x), а не просто if-then-else, который, по сути, обрабатывает только два случая.

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

% shelves locations
map([point(1,1), point(1,2), point(1,3), point(1,4),
     point(2,1), point(2,2), point(2,3), point(2,4),
     point(3,1), point(3,2), point(3,3), point(3,4),
     point(4,1), point(4,2), point(4,3), point(4,4),
     point(5,1), point(5,2), point(5,3), point(5,4),
     point(6,1), point(6,2), point(6,3), point(6,4),
     point(7,1), point(7,2), point(7,3), point(7,4),
     point(8,1), point(8,2), point(8,3), point(8,4)]).

print_shelf(1,4):-
    ShelfID is 5,
    write(ShelfID).

print_shelf(2,4):-
    ShelfID is 6,
    write(ShelfID).

print_shelf(3,4):-
    ShelfID is 7,
    write(ShelfID).

print_shelf(4,4):-
    ShelfID is 8,
    write(ShelfID).

print_shelf(1,8):-
    ShelfID is 1,
    write(ShelfID).

print_shelf(2,8):-
    ShelfID is 2,
    write(ShelfID).

print_shelf(3,8):-
    ShelfID is 3,
    write(ShelfID).

print_shelf(4,8):-
    ShelfID is 4,
    write(ShelfID).

print_shelf(Other, Hoka):-
    Hoka =/= 4,
    Hoka =/= 8,
    NonID is 'x',
    write(NonID).

%print_map... yet to be implemented...

ПРИМЕЧАНИЕ. Если вы хотите ответить на этот пост, пожалуйста, напишите свой ответ, опубликовав ответ с некоторыми конкретными примерами, к которым я могу привести, а не просто писать комментарий к моему посту с вопросом. Если вам хочется написать комментарий типа «Просто посетите www.learnprolognow.org», НЕ пишите комментарий в первую очередь. Я не спрашиваю такого ответа. Весь смысл написания этого поста чтобы найти объяснение, которое я не мог найти в существующем онлайн Электронные ресурсы. Пожалуйста, пишите комментарий вместо того, чтобы публиковать ответ, только если вы пытаетесь уточнить, что такое мой вопрос или что я имел в виду в той части кода, которую я предоставил перед тем, как опубликовать ответ. Заранее спасибо

1 Ответ

3 голосов
/ 27 января 2020

быстрый и грязный ответ ... обратите внимание, что последнее предложение print_shelf / 2 является неправильным, поскольку / 2 должно использоваться только для арифметического c. Итак, сначала абсолютно необходимо исправить:

print_shelf(_Other, Hoka):-
    Hoka =\= 4,
    Hoka =\= 8,
    NonID = 'x',
    write(NonID).

, а затем процедурный код, который распечатывает ваши данные, как вы просили:

print_map :-
    forall(between(1,8,Row), (
               forall(between(1,4,Col), (print_shelf(Col,Row), write(' '))),
               nl
           )).

Целые выходы

?- print_map.
x x x x 
x x x x 
x x x x 
5 6 7 8 
x x x x 
x x x x 
x x x x 
1 2 3 4 

Затем рассмотрим альтернативный подход, отказавшись от факта map / 1 и введя вместо него некоторые факты shelf_item / 3, утверждая положительное знание о магазине:

shelf_item(1,4,5).
shelf_item(2,4,6).
shelf_item(3,4,7).
shelf_item(4,4,8).
shelf_item(1,8,1).
shelf_item(2,8,2).
shelf_item(3,8,3).
shelf_item(4,8,4).

print_store :-
    forall(between(1,8,Row), (
               forall(between(1,4,Col), (
                          (   shelf_item(Col,Row,Item)
                          ->  true
                          ;   Item = x
                          ),
                          format('~w ',[Item])
                      )
                     ),
               nl
           )).

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