2016-10-01 4 views
1

私の目的は、同じ名前で個々のリストにアクセスできるようにリストのリストを分割することです。 I以下のリストを有する: -Prologコードの内部からファクトを作成できますか?

mylist([[1,2],[2,3],[3,4],[4,6]]). 

を私は[4,6]私がアクセスできるように、[3,4]、[2,3]、[1,2]にリストを破壊しますアイテム([1,2]のような)を個別に表示します。

そのために、分割されたリスト要素から新しいファクトを作成できますか?私は要素を個々のリストに分けることができます。しかし、私はそれらの個々のリストを事実に変換したい。以下のように: -

mylist([[1,2],[2,3],[3,4],[4,6]]). 

は次なる必要があります: -

node([1,2]). 
node([2,3]). 
node([3,4]). 
node([4,6]). 

そして私は、「ノード」を使用してそれぞれ、すべてのリストにアクセスすることができるはずです。

+2

'term_expansion/2'を使用してコンパイル時の用語展開と同様に' assertz/1'を参照してください –

答えて

0

CapelliCによって偉大な答えは(おそらく最高)(コメントで)お勧めです:あなたはまた、書くことができ

?-forall(member(X,[[1,2],[2,3],[3,4]]),assertz(node(X))). 

my_list(L):- member(X,L),assertz(node(X)). 

例:

?- my_list([[1,2],[2,3],[3,4]]). 
true ; 
true ; 
true. 
?- node([1,2]). 
true ; 
false. 

CapelliCのおかげで、もう1つの方法は、

01です
?- maplist(X>>assertz(node(X)), [[1,2],[2,3],[3,4]]). 
+1

: '? - maplist(X >> assertz(node(X))、[[1,2] [2,3]、[3,4]])。 – CapelliC

+1

はい、それは私が答えを編集することを指摘してくれてありがとう、素晴らしい実装です。 – coder

+1

'?-forall(メンバ(X、[1,2]、[2,3]、[3,4]])、assertz(node(X)))。'lambda + maplistの解決策のようにはるかに移植性が高く、効率的です – CapelliC

1

他の回答は良好です(特に、 forallソリューション)、ここでコンパイル時にリストを知っていて、コンパイル時にnode/1のファクトをデータベースに追加したい場合はどうすればよいでしょうか。

このコードはthis pageの一番下で入手可能な例から、単純化されています(私はnodes.plそれを呼び出します)ファイルで

term_expansion(nodes_list(NL), Nodes) :- 
     maplist(to_node, NL, Nodes). 

to_node(X, node(X)). 

nodes_list([[1,2],[2,3],[3,4],[4,6]]). 

私はファイルを参照するとき、私は取得:

?- [nodes]. 
true. 

?- listing(node). 
node([1, 2]). 
node([2, 3]). 
node([3, 4]). 
node([4, 6]). 

true. 

二つ詳細:

  1. 展開された述語、ここでnodes_list/1ではなく、がデータベースに格納されます。
  2. term_expansion/2の句は、の前に来て、ソースファイル内にnodes_list/1という定義が必要です。
関連する問題