2014-11-15 3 views
3

프롤로그에 문제가 있습니다. 명령형 패러다임을 가진 또 다른 언어라면 나에게 더 쉽습니다.하지만 그 점은 중요하지 않습니다. 몇 가지 항목이 있으며 그 중 일부는 얻을 수있는 요구 사항이 있습니다. 예를 들어, 항목 b가 있으면 이미 항목이 있음을 의미합니다.프롤로그의 항목 및 요구 사항 목록 확인

to_get(b):- 
    need(a). 

to_get(a3):- 
    need(a2), 
    need(a1). 

그래서 목록이 있습니다. 어떤 항목이 있는지 확인한 다음 각 항목의 요구 사항이 있는지 확인해야합니다. 그것이 없으면 새로운 목록을 만들어 거기에 추가해야합니다. 그리고이 새로운 목록을 반환하십시오.

L1 = [b, a1, a3] 

B는 필요하지만 그게 새로운 목록에 의미 있도록이, L1에서 L2

내가 그런 바보 같은 질문하지 희망
L2 = [a, a2] 

하지, 난 그냥 해요 새로운 프롤로그. 감사합니다.

답변

4

아마도 항목 간의 종속성을 설명하는 관계가 있다고 가정 할 수 있습니다. 아래는 closure0/3non_member/2입니다.

item_needs(b, a). 
item_needs(a3, a2). 
item_needs(a3, a1). 

items_missing(Items, Needed) :- 
    member(Item, Items), 
    closure0(item_needs, Item, Needed), 
    non_member(Needed, Items).  

?- items_missing([b,a1,a3],Missing). 
Missing = a ; 
Missing = a2 ; 
false. 

이 목록에이를 얻으려면 사용 setof/3 : 더 일반적으로

?- setof(M,items_missing([b,a1,a3],M),Ms). 
Ms = [a, a2]. 

그리고 :

items_missingitems(Items, Ms) :- 
    (ground(Items) -> true 
    ; throw(error(instantiation_error,_))), % safety check 
    (length(Items,_) -> true 
    ; throw(error(type_error(list,Items),_))), % one more 
    setof(M, items_missing(Items,M), Ms). 
+0

정의되지 않은 절차 : nonmeber/2 ERROR : 그러나,에 대한 정의가 있습니다 : 오류 : 비회원/2 지금이 오류가 발생합니다. –

+0

@false 누락 된 항목이없는 경우 실패하려면 들여 쓰기를합니까? 예 :'? - items_missingitems ([a], X)'. 빈 목록은이 경우 더 자연 스럽습니다. –

+0

@WouterBeek : 이것은 오래된 부정적인 질문입니다. 두 가지 모두 요점이 있습니다. – false