2015-11-10 2 views
0

все! У меня возникли проблемы с поиском всех позиций вхождения элемента минимума в списке.Пролог найти все должности в списке минимального элемента

Мой исходный код выглядит так:

**

findPos([], _, []). 
findPos([_],_,[1]). 
findPos([H1|Tail], Pos, [Pos|Ta]):- 
% "Pos" is the current position in the list 
     findMin([H1|Tail], V), 
     V=[H1], 
     Pos2 is Pos+1, 
     findPos([Tail], Pos2, [Ta]). 

findPos([H1|Tail], Pos, [Ta]):- 
     findMin([H1|Tail], V), 
     not(V=[H1]), 
     Pos2 is Pos+1, 
     findPos([Tail], Pos2, [Ta]).** 

где findMin получает в качестве первого аргумента список и возвращается с использованием второго параметра, минимальный элемент этого списка , Проблема в том, что каждый входной список, который я бы дал (за исключением void, для которого ответ был []), ответ всегда 1 ... и я не вижу, что мне не хватает. Любой ответ будет оценил: D Спасибо!

+0

пожалуйста отступ вашего кода правильно. –

+0

Извините, я новичок в этом -stack overflow-thing ...: D. – Nelly

+0

Вы можете использовать комбинацию 'msort/2',' nth1/3' и 'findall/3'. Три шага, и у вас есть свой ответ. :) – lurker

ответ

0

Обратите внимание, что ваша программа каждый раз пересчитывает минимум list; поэтому список с [1,7,1,2,3] увидит [1,1,2,3] как список «минимумов». Кроме того, этот процесс довольно дорог.

Другой аспект заключается в том, что вы делаете некоторые синтаксические ошибки в отношении синтаксического сахара списков, что приведет к ошибкам.

Решение - это распространено в информатике - для решения проблем. Я предлагаю, чтобы findPos был нацелен только на поиск индексов данного предмета. Такой findPos/3 предикат может выглядеть следующим образом:

findPos(X,L,Is) :- 
    findPos(0,X,L,Is). 

findPos(_,_,[],[]). 
findPos(I,X,[Y|T],MIT) :- 
    (X == Y -> MIT = [I|IT];MIT=IT), 
    I1 is I+1, 
    findPos(I1,X,T,IT). 

Предикат использует аккумулятор I, который отслеживает индекс, и увеличивает каждый раз, когда индекс.

Теперь вам нужно сделать предикат, который находит индексы минимальных элементов:

findMinPos(L,Is) :- 
    findMin(L,M), 
    findPos(M,L,Is). 
+0

Большое спасибо! :) – Nelly

+0

'findPos/4' не стойкий! Цель 'findPos (a, [a], [])' преуспевает; он должен потерпеть неудачу! – repeat

+2

@repeat: лучше? Хотя я согласен, что лучше писать хорошие предикаты, я думаю, что иногда более важно, чтобы новички понимали, как работает Prolog, не уделяя особого внимания разработке программы (* т.е. шаблоны дизайна также запланированы после того, как люди получили базовый уровень Java *). Кроме того, я определенно признаю, что я не стремился получить высокий уровень знаний в Prolog. –

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