2014-11-25 3 views
0

빈 목록을 만들고 어떻게 든 한 번에 하나씩 요소를 추가하고 싶습니다.한 번에 하나씩 목록에 요소 추가하기

call(X):- 
**Here I want to add X into a list L which was initially empty. 
    Everytime call(X) is called a new value of X is added to the list L** 

어떻게하면됩니까 ??

+1

여기서 명백한 질문은이 목록이 무엇이며 어떻게 사용할 것인지입니다. 실제 문제에 따라 다른 솔루션이있을 수 있습니다. –

+1

일반적으로 가능한 경우 변수 수정을 피해야합니다. 그러한 수정은 프롤로그 선언 성을 손상시킵니다. 수정 된 목록을 다른 매개 변수로 반환하는 것을 고려하십시오. 수정을 피할 수없는 경우 (우리는 실제로 변화하는 세계를 떠납니다) asssert()는 받아 들일 만 한 해결책입니다. 참고 : 이론적으로 꼬리에 항목을 추가 할 수있는 자체 목록 구현을 만들 수는 있지만 그러한 시도는 실제로 가치가 없습니다. – user396672

답변

2

"목록에 추가"란 무엇을 의미합니까? 그리고이 목록을 어떻게 사용 하시겠습니까?

한 가지 가능한 방법은 사실 테이블,리스트 요소마다 1 개의 사실로 목록을 작성하는 것입니다 :

add_front(X) :- 
    asserta(list(X)). 

add_back(X) :- 
    assertz(list(X)). 

목록을 검색하려면, 당신은 findall(X, list(X), List)를 사용할 수 있습니다

?- add_front(a), add_front(b), add_back(X). 
true. 

?- findall(X, list(X), List). 
List = [b, a, _G342]. 

이가 유효한 해결책이지만, 잘못 생각한다면 실제로 목록을 다루는 것입니다. 이 목록의 값은 어디에서 비롯 되었습니까? 당신은 당신의 입력이 유효한 프롤로그 용어를하고 점으로 라인을 종료해야한다는 것을 기억해야

read_list(List) :- 
    read(T), 
    ( T == end_of_file 
    -> true 
    ; format('~w~n', [[T|List]]), 
     read_list([T|List]) 
    ). 

: 그들은 사용자 상호 작용에서 오는 경우에도, 더 나은 예를 들어 목록을 만들 수있는 방법이 있습니다

?- read_list([]). 
|: 1. 
[1] 
|: b. 
[b,1] 
|: foo(bar). 
[foo(bar),b,1] 
|: X. 
[_G1279,foo(bar),b,1] 

... 등등. 파일 끝으로 파일을 중단하면 성공합니다. 모든 입력에 대한 전체 목록에 액세스 할 수 있습니다.

trasform하려는 목록으로 시작하는 경우, 예를 들어 maplist을 조사해야합니다.

관련 문제