Пролог пытается значения, пока они не будут правильными, а затем вернуть их - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь сделать rule в Prolog, где я проверяю, подходит ли он, если нет, я увеличиваю и проверяю снова, пока он не подходит.Но моя проблема в том, что когда я узнаю числа, где он fits, и пытаюсь их вернуть, исходные числа остаются прежними.

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

make_it_fit(X,Y):-
    does_it_fit(X, Y),
    write(['Nums ', X,Y]).

%--- Check if fits, if not then increase number and check until fits
does_it_fit(X,Y):-
   (fits(X,Y));
   (find_new(X,Y,X1,Y1),does_it_fit(X1,Y1)).

Поэтому, когда я звоню:

?- make_it_fit(5,5).

Это идет к does_it_fit(5,5), делает fits(5,5), выясняетчто он не подходит, увеличивает числа до (6,6) и вызывает does_it_fit(6,6), затем проверяет fits(6,6), выясняет, подходит ли он и возвращает.

Теперь, когда я пишурезультаты только для того, чтобы увидеть их, он по-прежнему печатает (5,5), а не (6,6).

Что я здесь не так делаю?

Если я не объяснил это достаточно четко, то сделайтерасскажите, и я постараюсь объяснить это дальше.

1 Ответ

0 голосов
/ 05 декабря 2018

По сути, ваша проблема в том, что вы ожидаете переназначения X и Y во время вызова does_it_fit/2 и получения новых значений впоследствии.Но переменные Пролога не являются «присваиваемыми», они работают больше как переменные в математике, поэтому вам нужно будет предоставить другой набор переменных для размещения результатов.

does_it_fit(X, Y, X , Y ) :- fits(X, Y). 
does_it_fit(X, Y, XN, YN) :- 
    \+ fits(X,Y), 
    find_new(X, Y, X1, Y1), 
    does_it_fit(X1, Y1, XN, YN).

Затем вызов make_it_fit/2также придется изменить:

make_it_fit(X,Y):-
    does_it_fit(X, Y, XN, YN),
    write(['Nums ', XN, YN]).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...