Я новичок в Прологе, и я пытаюсь его понять.
Я начал с простой программы, которая должна:
- check if an element is contained in the rest of the list
- if FALSE do nothing
- если TRUE, добавьте его во второй список. (во второй список должно быть добавлено только одно вхождение символа).
Несколько примеров с ожидаемыми результатами:
?- occ([a,b,c,a,a,b,e,f,g], Y).
Y = [a,b].
?- occ([a,a,a,a,a], Y).
Y = [a].
?- occ([a,b,c,d,e,f,g], Y).
Y = [].
Вот код, который я написал, но у меня есть некоторые проблемы (он всегда возвращает true
).
occ([],[]).
occ([],_Y).
occ([X|Xs],[X|Y]) :-
occ(Xs,Y),
member(X,Xs),
not(member(X,Y)),
!.
occ([_X|_Xs],_Y).
Я попытался использовать отладчик и обнаружил, что not(member(X,Y))
всегда false
, а в разделе привязки есть только X
и Xs
и никогда Y
. Любой совет очень ценится! Спасибо.
ОБНОВЛЕНИЕ
Я думаю, что решил это, вот код:
occ([],[]).
occ([X|Xs],[X|Y]) :-
occ(Xs,Y),
member(X,Xs),
not(member(X,Y)),
!.
occ([_X|_Xs],[]).
Но я не совсем уверен, почему это работает сейчас... в 3-м occ
я поменял _Y
на []
.. Но почему это меняет результаты?
occ([], _Y).
всегда будет успешным, независимо от второго аргумента, если первый аргумент — это пустой список[]
. Иocc([_X|_Y], _Y).
всегда будет успешным, если первый аргумент представляет собой список хотя бы из одного элемента, и независимо от того, какой второй аргумент. Что вы хотите сделать, так это убедиться, что каждое предложение имеет смысл само по себе, поскольку выражает действительное правило относительно своих аргументов. - person lurker   schedule 26.11.2015[X|Y]
является результатом[X|Xs]
, еслиY
является результатомXs
, аX
является элементомXs
, аX
не является элементомY
. - person lurker   schedule 26.11.2015