2016-06-11 6 views
1

リストM = [[1/4,2/2,3/5,4/3,5/1]、[1/3 、2/5,3/2,4/4,5/1]、[1/5,2/3,3/3,4/4,5/2]、[1/4,2// 3、4/5、5/2]、[1/5、2/2、3/4、4/1、5/3]、[1/1、2/4、3/2、4/5 、5/3]、[1/2,2/5,3/3,4/1,5/4]、[1/1,2/3,3/5,4/2,5/4] [1/3、2/1、3/4、4/2、5/5]、[1/2,2/4/4、3/1、4/3、5/5]]。Prolog - リストに特定のアイテムが含まれているかどうかを確認する方法

特定のアイテム(3/5など)を含むリストのリストのみを返したいとします。

私はのように見える機能書いてみました:Fは、その中に3/5を持つリストが含まれているように、私はピック(M、3,5、F)を照会することができるように

include([X/Y|Rest],I,J):- 
    X=:=I, 
    Y=:=J, 
    include(Rest,I,J). 

pick([Item|Rest],I,J,Final):- 
    include(Item,I,J), 
    pick(Rest,I,J,[Item|R]). 

を。私が書いた機能が正しく動作しない、それを修正するのを手伝ってもらえますか?

+2

リストにメンバーが含まれているかどうかを確認するには、 'memberchk/2'を使用します。 'I/J'が' Item'のリストにある場合、 'memberchk(I/J、Item)'は成功します。あなたの 'include/3'述語には基本的なケースはなく、与えられたリストのすべての*要素が' I/J'であることを保証しようとするので、常に失敗します。 – lurker

答えて

0

lurkerが言ったように、メンバーを使用して、基本ケースを忘れないでください。

foo([],_,F). 
foo([H|T],Item,[H|F]):- 
    member(Item, H), 
    foo(T,Item,F). 
foo([_|T],Item,F) :- 
    foo(T,Item,F). 
+1

'foo([[3/5]]、3/5、[])'が正しく失敗する – false

関連する問題