Вопрос пролога - PullRequest
       4

Вопрос пролога

0 голосов
/ 16 декабря 2010

Я новичок в прологе, и мне нужно написать программу о кувшинах с водой.Моя проблема касается начального состояния кувшинов и формирования запросов.Запрос будет иметь вид:

?- myPredicate(args), filled(j1,1)

Значение j1 заполнено 1 галлоном воды.j1 представляет один из кувшинов;другой - j2.Изначально у меня есть

filled(j1,0) 
filled(j2,5) 
capacity(j1,2) 
capacity(j2,5) 

Я был бы очень признателен, если бы вы предоставили мне информацию относительно следующего:

Вопрос A: Должен ли я объявить начальное состояниеJ1 внутри моей программы?filled(j1,0)

Вопрос B: Мне нужно, чтобы моя программа нашла решение для заполненных (j1,1).Для этого у меня есть некоторые идеи, но в чем я не уверен, так это как обновить заполненный (J, том) из запроса и myPredicate.

Я очень смущен, так как у меня есть начальное состояние filled(j1,0) и теперь я должен создать filled(j1,1) в myPredicate.Так что у меня должна быть какая-то форма filled(J,Volume) в myPredicate, поэтому запрос возвращает true вместо false.

Как включить filled(J,Voume) в myPredicate, чтобы при выполнении вышеуказанного запроса я мог показать правильный ответ?

1 Ответ

0 голосов
/ 17 декабря 2010

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

my_loop(N) :- N > 10.

my_loop(N) :- N =< 10,
    write(N), nl,
    Nextin is N + 1,
    my_loop(Nextin).

:- my_loop(1).

A:
Данная информация (факты) необходима программе.Они могут быть доступны из ввода с клавиатуры, в качестве начальных аргументов для некоторого предиката или в виде фактов в базе данных, как вы предложили.Кроме того, предлагаемые только для особых ситуаций факты могут быть жестко закодированы в некоторый предикат или правило.

Ниже и выше приведен пример передачи исходной информации в виде параметров: :- my_predicate(args...).

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

:- my_predicate([fill(j1,0),fill(j2,5)], Answer),
    write(Answer),
    nl.

B:

См. my _ loop пример:

В my_loop задача подсчета [1..10] решается итеративно.В качестве параметра передается значение: 1, главным образом потому, что программа делает то же самое снова и снова:
1. взять число (N);выйти, если он слишком большой.В противном случае ...
2. распечатайте его.
3. рассчитайте следующее число (N + 1)
4. повторите

10 в жестком коде.Это мог быть факт: stop_after(10).

Теперь данные, которыми нужно манипулировать, переменная N в my_loop и {j1, j2} в myPredicate фактически не нуждается в переназначениии снова: смотрите my_loop.Просто введите заново вычисления, когда придет время повторить то же самое, но с другими параметрами:

cap(j1,2).
cap(j2,5).

my_predicate(Status, Answer) :-
    got_juice(Status,0),
    Answer=Status.

%%% Instead of changing values, rerun comp. with new values
%%% based on a computation made from the old ones.
my_predicate([filled(j1,J1), filled(j2,J2)], Answer) :-
    Used is J1 + J2,
    got_juice(Used, J), J \= 0,
    cap(j1,C1), cap(C2),
    %% Use cap and filled to add more to filled..
    NextJ1 is J1 + ...,
    NextJ2 is J2 + ...,
    my_predicate(filled(j1,NextJ1), filled(..., Answer).

ПРИМЕЧАНИЕ:
Приведенный выше предикат просто демонстрирует итерацию в Прологе, используя параметры"myProgaram".Для фактической реализации см. Программу, предложенную в комментарии от matcheek.

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