Каков эффект "!"
Вырез сокращает пространство поиска. То есть в чистой и монотонной программе разрез удалит некоторые решения или ответы. Пока они избыточны, это нормально. Звучит так невинно и полезно, не правда ли? Давайте посмотрим!
И, если я забыл, использование [E,Nr]
для обозначения пар довольно необычно, лучше используйте пару E-Nr
.
Теперь мы сравним counter_cut/2
и counter_sans/2
.
| ?- counter_cut([a,a],Xs).
Xs = [[a,2]].
| ?- counter_sans([a,a],Xs).
Xs = [[a, 2]]
; Xs = [[a, 1], [a, 1]]. % <<< surprise !!!
Так что в урезанной версии меньше решений. Кажется, решение, которое counter_cut/2
сохранил, является правильным. В этом особом случае. Всегда ли он будет брать правильный? Я попробую минимально более общий запрос:
| ?- counter_cut([a,B],Xs).
B = a,
Xs = [[a, 2]].
| ?- counter_sans([a,B],Xs).
B = a,
Xs = [[a, 2]]
; Xs = [[a, 1], [B, 1]].
Опять же, _sans
болтливее, и на этот раз даже немного правее; для последнего ответа включает B = b
. Другими словами,
| ?- counter_cut([a,B], Xs), B = b.
fails. % incomplete !
| ?- counter_sans([a,B], Xs), B = b.
B = b,
Xs = [[a,1],[b,1]].
Так что иногда _cut
версия лучше, а иногда _sans
. Или, говоря более прямо: и то, и другое как-то не так, но _sans
-версия, по крайней мере, включает все решения.
Вот «очищенная» версия, которая просто переписывает последнее правило в двух разных случаях: один для конца списка, а другой для другого, другого элемента.
counter_pure([],[]).
counter_pure([H|T],[[H,C1]|R]) :- counter_pure(T,[[H,C]|R]), C1 is C+1.
counter_pure([H],[[H,1]]).
counter_pure([H,D|T],[[H,1]|R]) :- dif(H,D), counter_pure([D|T],R).
С точки зрения эффективности это не слишком известно.
Вот тестовый пример эффективности для системы с рациональным объединением деревьев:
?- Es = [e|Es], counter(Es, Dict).
resource_error(stack).
Вместо этого реализация должна плавно зацикливаться, по крайней мере, до конца этой вселенной. Строго говоря, этот запрос должен выдавать ошибку ресурса, но только после того, как он подсчитал до числа, значительно превышающего 10^100000000
.
person
false
schedule
09.05.2017