2016-05-07 1 views
3

Я ожидал, что встроенная длина/2 предиката будет линейной по числу логических выводов. Однако представляется, что оно является постоянным:Число логических выводов длины/2 в Prolog (swi-pl)

?- length(L,10),time(length(L,X)). 
% 2 inferences, 0.000 CPU in 0.000 seconds (63% CPU, 142857 Lips) 

?- length(L,20),time(length(L,X)). 
% 2 inferences, 0.000 CPU in 0.000 seconds (62% CPU, 153846 Lips) 

?- length(L,30),time(length(L,X)). 
% 2 inferences, 0.000 CPU in 0.000 seconds (65% CPU, 111111 Lips) 

Это потому, что процедура делегирована C? Я не смог найти соответствующий код в базе данных SWIPL.

ответ

3

длина/2 имеет мелкий, но мощный интерфейс вблизи линии 3230 в init.pl. Оттуда он называет '$skip_list'(Length0, List, Tail), «швейцарским ножом» интерфейса списка C.

Вы можете найти его в ИПВ/PL prims.c, линия 2377 и следующее:

/** '$skip_list'(-Length, +Xs0, -Xs) is det. 

Xs0, Xs is a pair of list differences. Xs0 is the input list and Xs is 
the minimal remaining list. Examination of Xs permits to classify the 
list Xs0: 

     Xs  | list type of Xs0 | Length 
     [] ... | well formed  | length 
     Var ... | partial   | elements skipped 
     [_|_] ... | infinite   | upper bound for cycle 
     Term ... | malformed   | elements skipped 
*/ 
PRED_IMPL("$skip_list", 3, skip_list, 0) 
... 
+2

В SICStus, есть 'Пролог: '$ list_info' (xs0, длина, Xs)' – false

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