Работа с 2D массивами в Прологе - PullRequest
1 голос
/ 26 ноября 2011

Я прошу помощи в базовом Прологе, языке, парадигмы которого мне трудно понять.Я очень хорошо знаком с другими языками (C ++, Lisp, Java, Assembly и т. Д.), Но я новичок в Prolog.

Что необходимо решить - на базовом английском языке: с учетом 2 параметров найдите соответствующийчисло в двумерном массиве.

Проблема состоит в том, что в Интернете безмозгло простая головоломка, которая просит вас выбрать число, выбрать цвет этого номера, а затем выбрать дом, в котором содержится данное число.Головоломка настроена таким образом, что для каждой соответствующей комбинации цвета / дома есть только одно число.

То, что в настоящее время находится на месте:

function guess(Color, Houses) :-
<--Need what goes here -->

green(1, 15, 23, 24).
pink(2, 6, 10, 18).
etc...

houseA(2, 4, 7, 14).
etc...

Код должен соответствовать цветам и домам, чтобывыберите правильный номер.Так, например, учитывая, что "?- guess(pink, houseA)" должен вернуть "Your number is 2."

Я записывал идеи о том, как реализовать это в прологе, и ни один из них не дал мне дальнейшего.Я не знаю, как бы я реализовал операторы if / else, чтобы проверить, какой цвет мне нужно искать, или как проверить, какие числа будут соответствовать между домом и цветом, или даже как «вернуть» значения!

Кажетсядля меня, что я упускаю ключевой момент или ... образ мышления о языке.

Буду признателен за любую помощь.Спасибо!

Ответы [ 2 ]

1 голос
/ 26 ноября 2011

Чтобы вернуть значение, вам нужен другой параметр в вашем предикате (не функция btw).Этот параметр будет свободной переменной, и вы свяжете его с результатом.

В спецификациях пролога такие параметры отмечены -Параметр, в то время как отмечены уже связанные параметры + Параметр и параметры, которые могут быть как связаны, так и свободны, являютсяотметил? Параметр.Так что здесь у вас может быть комментарий, такой как:

% guess/3 (specify the arity of your predicate)
% guess(+Color, +House, -Result) (give info about your parameters)
% guess finds a color shared by Color and House and binds it to Result.

Тогда предикаты, такие как pink, houseA и т. Д., Не так уж хороши для поиска чисел.Вы можете превратить их в более адаптированные предикаты, храня числа в списке:

green([1, 15, 23, 24]).
pink([2, 6, 10, 18]).
houseA([2, 4, 7, 14]).

Когда мы получили этот список, мы можем написать:

guess(Color, House, Result) :-
    call(Color, Pool1),

Если вы вызываете догадку (розовый, houseA), который будет называть ваш предикат розовым с аргументом Pool1, пролог попытается сопоставить Pool1 и [2, 6, 10, 18], поэтому Pool1 будет точно привязан к этому списку.

    call(House, Pool2),

То же самое с houseA и Pool2.

    member(Result, Pool1),

Теперь мы говорим прологу, что хотим, чтобы наш Результат был членом Pool1

    member(Result, Pool2),

И членом Pool2.

    write('Your number is '),
    write(Result),
    write(.),
    nl.

Наконец, мы отображаем сообщение.

Пролог отобразит результат как R = x;ложь ниже этого, если вы не хотите;ложная часть, вы можете добавить «cut»:

    nl.

=>

    nl,
    !.

Предикат ! / 0 (cut) говорит прологу не возвращаться назадпопытаться найти другие решения.Там он должен был отозвать участника, объясняющего, почему пролог вернул выбор только с одним результатом и ложным.

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

1 голос
/ 26 ноября 2011

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

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