1

私は次のものを持っています:

:- use_module(library(csv)).
:- dynamic mb/3.
:- dynamic mb_column_keys/1.

prepare_db(File) :-
    retractall(mb_column_keys(_)),
    retractall(mb(_,_,_)),
    forall(read_row(File, Row), store_row(Row)).

store_row(Row) :-
    Row =.. [row|Cols],
    (   mb_column_keys(ColKeys)
    ->  Cols = [RowKey|Samples],
    maplist(store_sample(RowKey), ColKeys, Samples)
    ;   (Cols = [_H|T],assertz(mb_column_keys(T)))
    ).

store_sample(RowKey, ColKey, Sample) :-
    assertz(mb(RowKey, ColKey, Sample)).

read_row(File, Row) :-
     csv_read_file_row(File, Row, []),
     writeln(read_row(Row)).

prepare_db が column_keys と mb の述語を定義するために 2 つの追加引数を取ることができるように、これを適応させる最良の方法は何ですか。

例えば?-prepare_db('my_file.csv',mb_column_keys,mb).

mb/3 および mb_column_keys/1 に対してファクトがアサートされる結果になります

OK、ファイルを次のように変更しました。

:- use_module(library(csv)).
:- set_prolog_stack(global, limit(4*10**9)).

prepare_db(File, Column_Key,Relation) :-
     Column_Key_Term =.. [Column_Key,_],
     Relation_Term =.. [Relation,_,_,_],
     retractall(Column_Key_Term),
     retractall(Relation_Term),
     forall(read_row(File, Row), store_row(Row,Column_Key,Relation)).

store_row(Row,Column_Key,Relation) :-
     Column_Key_Test =.. [Column_Key,ColKeys],
     Row =.. [row|Cols],
     (   call(Column_Key_Test)
     ->  Cols = [RowKey|Values],
         maplist(store_relation(Relation,RowKey), ColKeys, Values)
         ;   ( Cols = [_H|T],
               Column_Key_Term =.. [Column_Key,T],
               assertz(Column_Key_Term)
             )
     ).

store_relation(Relation,RowKey, ColKey, Values) :-
     Relation_Term =.. [Relation,RowKey,ColKey,Values],
     assertz(Relation_Term).

read_row(File, Row) :-
    csv_read_file_row(File, Row, []),
    writeln(read_row(Row)).

しかし、それは少し醜いように見えます.これを達成するためのよりエレガントな方法はありますか?

4

1 に答える 1