Глядя на ответ этого поста , вы можете использовать предикат flatten_term/2
, немного модифицированный для обработки свободных переменных, чтобы решить вашу проблему. Вот код для базового решения:
flatten_term(Term,[Term]):-
(atomic(Term);var(Term)),!.
flatten_term(Term,Flat):-
Term =.. TermList,
flatten_term_list(TermList,Flat),!.
flatten_term_list([],[]):-!.
flatten_term_list([H|T],List):-
flatten_term(H,HList),
flatten_term_list(T,TList),
append(HList,TList,List),!.
occurrences(_,[],N,N):-!.
occurrences(A,[H|T],N,Tot):-
A \== H,!,
occurrences(A,T,N,Tot).
occurrences(A,[H|T],N,Tot):-
A == H,!,
N1 is N+1,
occurrences(A,T,N1,Tot).
count(A,Term,N):-
flatten_term(Term,Flatten),
occurrences(A,Flatten,0,N).
?- count(a,f(a,g(X,a),d),T).
T = 2.
?- count(X,f(a,g(X,a),d),T).
T = 1
Прежде всего вы сгладьте термин, используя flatten_term/2
. Затем просто посчитайте вхождения элемента, который вы хотите найти, используя occurrences/4
. Вы можете, если хотите, изменить flatten_term/2
, чтобы избежать использования occurrences/4
и, таким образом, сканировать термин (список) только один раз ... Что-то вроде: flatten_term(Term,Flatten,ElementToFind,Counter,Total)
.
Необходимо инициализировать ContentPropertyAttribute с названием свойства, это собирается представить содержание класса. В Вашем случае, потому что Вы наследовались ObservableCollection, который был бы свойством Items. К сожалению, свойство Items только для чтения, и это не позволяется, потому что свойство Content должно иметь метод set. Таким образом, необходимо определить пользовательское свойство обертки вокруг Объектов и использования что в атрибуте - как так:
public class MyCustomItem
{ }
[ContentProperty("MyItems")]
public class MyCustomCollection : ObservableCollection<MyCustomItem>
{
public IList<MyCustomItem> MyItems
{
get { return Items; }
set
{
foreach (MyCustomItem item in value)
{
Items.Add(item);
}
}
}
}
И необходимо быть в порядке. Извините за выполнение этого в C#, когда Ваш пример находится в VB, но я действительно сосу в VB и не мог получить даже такую простую вещь право... Так или иначе это - снимок для преобразования его, таким образом - надеются, что это помогает.