如何从列中提取列并在prolog中将它们用于另一个谓词?

时间:2017-03-23 20:56:25

标签: prolog

我想使用" extract"的结果。 (W)在valid_seq中,然后在valid_columns中使用。

到目前为止,我已尝试过此操作,但它不起作用:

extract(_,[],[]).
extract(K,[X|Y],[H|L]) :- nth1(K,X,H), extract(K,Y,L).

valid_columns([],[]).
valid_columns([H|L],[X|Y],K) :- b_w(X),
                extract(K,X,W), 
                valid_seq(H,W),
                K1 is K+1,
                valid_columns(L,Y,K1).

编辑:

我正在尝试解决非图形问题。 因此,从每个行列表中,我必须提取列以验证它们。这是函数" extract"

提取列后,我需要验证它们。 实施例

valid_column([[1,1,1,1,1],[1,0,0,0,0],[1,1,1,1,1],[0,0,0,0,1],[1,1,1,1,1]],[3,1],1).
false.

这里我要问每个[]中的第一个值是否符合[3,1]。 在这种情况下应该是真的。因为我有[1 1 1 0 1]。

这是我的代码:

test_cst(0,[0|S],S).   
test_cst(0,[],[]). 
test_cst(N,[1|T],S):- 
                    N1 is N-1,
                    test_cst(N1,T,S).

valid_seq([],[]).      
valid_seq(L,[0|T]):-valid_seq(L,T).      

valid_seq([H|L],[1|T]):-test_cst(H,[1|T],S),valid_seq(L,S). 

b_w([]).
b_w([H|L]) :- H is 0, b_w(L);H is 1, b_w(L).

valid_lines([],[]).
valid_lines([H|L],[X|Y]) :- b_w(X), 
                            valid_seq(H,X),
                            valid_lines(L,Y).


extract(_,[],[]).
extract(K,[X|Y],[H|L]) :- nth1(K,X,H), extract(K,Y,L).

valid_columns([],_,_).
valid_columns([H|L],X,K) :- valid_column(X,H,K),
                            K1 is K+1,
                            valid_columns(L,X,K1).

valid_column(X,H,K) :- b_w(X),
                       extract(K,X,W), 
                       valid_seq(H,W).

1 个答案:

答案 0 :(得分:1)

如果可用,您可以充分利用库(apply):

b_w(L) :- maplist([X]>>(X=0;X=1), L).

我建议使用它,因为它简化了代码,删除了不相关的细节,模糊了关系

对于您的问题,您将b_w / 1传递给列表列表,而它应该是一个列表。如果您有库(yall)可用,则可以重写b_w / 1,如

shell_exec('mono Release/X12Parser.exe Release/EDI_FILES/first_edi.edi Release/XML_FILES/firstXML.xml');