2010-12-16 3 views
0

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

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

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

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

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

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

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

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

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

+2

* «... и у меня ** есть **, чтобы написать программу ...» * - Это домашнее задание? – thkala 2010-12-16 18:16:22

+1

Я не понимаю, в чем именно проблема. Можете ли вы дать мне полное описание проблемы, полученной из университета, я думаю? Не зная, в чем тут проблема, я не могу дать вам ответа, но ... здесь я нашел очень похожую проблему с вашим ответом, уже полученным http://www.informatik.uni-freiburg.de/~ki/ преподавание/ws0708/logic/prolog7.pdf, слайд 17-й и далее – matcheek 2010-12-17 03:14:58

ответ

-2

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

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. 

В:

Смотрите мой _ петли пример:

В my_loop, задача подсчета [1..10] решается итеративно. Givens: 1 передается как параметр, главным образом потому, что программа выполняет одно и то же: over-and-over:
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.

Смежные вопросы