빈 목록을 만들고 어떻게 든 한 번에 하나씩 요소를 추가하고 싶습니다.한 번에 하나씩 목록에 요소 추가하기
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**
어떻게하면됩니까 ??
빈 목록을 만들고 어떻게 든 한 번에 하나씩 요소를 추가하고 싶습니다.한 번에 하나씩 목록에 요소 추가하기
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 개의 사실로 목록을 작성하는 것입니다 :
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
을 조사해야합니다.
여기서 명백한 질문은이 목록이 무엇이며 어떻게 사용할 것인지입니다. 실제 문제에 따라 다른 솔루션이있을 수 있습니다. –
일반적으로 가능한 경우 변수 수정을 피해야합니다. 그러한 수정은 프롤로그 선언 성을 손상시킵니다. 수정 된 목록을 다른 매개 변수로 반환하는 것을 고려하십시오. 수정을 피할 수없는 경우 (우리는 실제로 변화하는 세계를 떠납니다) asssert()는 받아 들일 만 한 해결책입니다. 참고 : 이론적으로 꼬리에 항목을 추가 할 수있는 자체 목록 구현을 만들 수는 있지만 그러한 시도는 실제로 가치가 없습니다. – user396672