Prolog-SWI: процедура, которая устраняет один случай - PullRequest
0 голосов
/ 12 июня 2011

У меня есть следующая функция из книги:

% Signature: select (X,HasXs,OneLessXs)/3 
% purpose: The list OneLessXs is the result of removing 
 one occurrence of X from the list HasXs. 
select(X,[X|Xs],Xs).  *rule number 1* 
select(X,[Y|Ys],[Y|Zs]) :- select(X,Ys,Zs).  * rule number 2*

?- select(4,[2,3,2,4,5,2,4],X].
X=[2,3,2,5,2,4]

Но я не понял, как он находит правильный ответ. После того, как он удаляет все Y =! X, он приходит к правилу № 1 с: Xs=4,5,2,4, затем возвращается true. а что тогда? Если продолжить правило 2, то он также уберет следующую «4». Если он не продолжает правила 1, то как Zs [2,3,2,5,2,4]? Я думаю, что мне не хватает основного правила.

1 Ответ

1 голос
/ 12 июня 2011

Вы можете понять, почему это происходит, подумав, как это будет выполняться.Итак, у вас есть:

% I use K here instead of X, so there is no
% confusion with the X on the rules
select(4,[2,3,2,4,5,2,4], K).

Сначала он проверит правило 1, но 4 != 2, поэтому он продолжит правило 2. В правиле 2 у вас есть эти «привязки»:

И K привязаны к [2 | Zs] и , а не просто Zs.Следующий select вызов, который будет select(4, [3, 2, 4, 5, 2, 4], Zs), находит Zs и так далее.Вот почему возвращаемый результат: K=[2,3,2,5,2,4], а не K=[5, 2, 4], как вы ожидали.

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