2011-02-19 8 views
2

논리를 구현하는 데 막혔습니다. 내 프로그램의 일부 인스턴스에서 List라는 이름의 List가 있습니다. 이 목록의 길이는 가변적이며 미리 알지 못합니다. 이제 사실을 만들기 위해이 목록을 펑터에 전달해야하며 구현할 수 없습니다. 예를 들어 : 목록 목록 [first,second,third] 다음이 사실 functor(first,second,third).
등을 추가해야하는 경우 [first,second] 후이 사실을 functor(first,second).
를 추가해야하는 경우 목록이목록을 functor 매개 변수로 변환

경우 [first]는이 사실을 functor(first).
을 추가해야합니다. ..

나는 =..으로 시도했지만 여기서는 가변 길이 제약을 매핑 할 수 없습니다. 고정 길이의 경우 수행 할 수 있지만 목록에 몇 개의 요소가 포함되는지 미리 알 수 없습니다.

이 논리를 구현하기위한 제안 사항. 감사.

답변

5

=..과 문제를 이해하지 못하는 그러나 이것은 나를 위해 일한 : 당신이 원 주장 할 수없는, 그래서 내가 대신 단순히 functorfunctor/3 때문에 my_functor를 사용

assert_list(List) :- 
      Term =.. [my_functor|List], 
      assert(Term). 

참고 내장 술어 functor 사실 (functor(first, second, third)).

를 호출 :

?- assert_list([first,second,third]). 
true. 

작동하는지 확인 :

?- listing(my_functor). 
:- dynamic user:my_functor/3. 

user:my_functor(first, second, third). 

true. 

참고 기술적으로, 서로 다른 n 차 my_functor/n 조건이 같은 조건이되지 않습니다. 각 n에 대해 프로그램에서 다른 쿼리를 사용해야합니다. 이 문제를 회피하기 위해, 당신은 단순히 my_functor의 하나로서 목록 만 인수를 주장 할 수 :

?- List = [first, second, third], 
assert(my_functor(List)). 
true. 

?- listing(my_functor). 
:- dynamic user:my_functor/3. 

user:my_functor([first, second, third]). 

true. 

내 SWI - 프롤로그 버전은 5.7.5이다.