Имя метода конструктора имеет то же имя, что и класс. Кроме того, он не имеет типа возврата. Или, если вы это сделаете, сам метод конструктора не имеет имени, но тип возвращаемого типа - это тип класса.
public class Foo {// Constructor public Foo () {} public void Bar ( ) {}}
Подталкивание: вы находите индексы, но вы их не собираете.
indices(List, E, Is) :-
indices_1(List, E, Is, 1).
Для пустого списка список индексов пуст, и элемент не имеет значения
indices_1([], _, [], _).
Если элемент похож на голову, соберите индекс.
indices_1([E|Xs], E, [I|Is], I) :-
I1 is I + 1,
indices_1(Xs, E, Is, I1).
Для этого требуется другое условие.
EDIT:
. Один из способов сделать это:
indices_1([X|Xs], E, Is, I) :- dif(X, E),
I1 is I + 1,
indices_1(Xs, E, Is, I1).
В предыдущем пункте глава списка и Элемент унифицированы. В этом пункте они явно различны. Это означает, что только одно из двух предложений может быть истинным для элемента списка в первом аргументе.
EDIT:
Другой способ сделать это - использовать findall
и nth1
:
indices(List, E, Is) :-
findall(N, nth1(N, List, E), Is).
indices_1([_|T], E, Is, I) :- I1 is I + 1, indices_1(T, E, Is, I1).
– Andrew Burgess 6 October 2014 в 20:52R = 1,3]
), в то время как мой «возвращает» каждый шаг (например,R = [1,3]; R=[1]; R=[3], R=[]
. Почему? – Andrew Burgess 6 October 2014 в 21:10dif/2
вместо(\==)/2
? Всегда есть какие-то уродливые случаи, скрывающиеся вокруг. – false 3 December 2014 в 14:24