2011-05-12 76 views
-1

我试图让我的代码更加动态。我有以下内容的文件:在Prolog中动态设置参数

a(b1, c1, d1). 
a(b2, c2, d2). 
a(b3, c3, d3). 

当我发现所有b1,我做出这样的名单:

[b1, b2, b3]. 

当元数的变化在文件中,例如,当a(b1,c1,d1)变成a(b1,c1,d1,e1),我的代码不起作用。有没有办法解决这个问题?我正在使用SWI-Prolog。

start :- 
    consult('file.pl'), 
    solve(L1, L2, L3), 
    list_to_set(L1, X), 
    write(X). 

solve(L1, L2, L3):- 
    findall(First, data(First, _, _), L1), 
    findall(Second, data(_, Second, _), L2), 
    findall(Third, data(_, _, Third), L3). 
+1

可能重复[如何根据序言元数推广计划? ](http://stackoverflow.com/questions/5949012/how-to-generalize-program-according-to-arity-in-prolog) – 2011-05-13 08:33:01

回答

0

如果元数的变化,你应该把参数列表中,并使用nth1/3

类似的问题here顺便说一句的

0

start:- 
     consult('file.pl'), 
     sampling(Arity), 
     solve(Arity,LL), 
     list_to_set(LL, X), 
     write(X). 

solve(Arity,LL):- 
     length(L,Arity), 
     P =.. [data|L], 
     findall(L1,(
        for(1,N,Arity), 
        nth1(N,L,A), 
        findall(A,P,L1)), 
       LL). 

sampling(Arity) :- 
     see('file.pl'), 
     read(P), 
     sampling(P,Arity), 
     seen. 

sampling(end_of_file,_) :- !,seen,fail. 
sampling(P,Arity) :- 
     functor(P,data,Arity),!. 
sampling(_,Arity) :- 
     read(P), 
     sampling(P,Arity). 
+0

嗨,谢谢你的回答。但我有一个问题。怎么能 – Tolga 2011-05-12 13:58:44