在Prolog中动态设置参数

时间:2011-05-12 08:10:31

标签: list file prolog predicate arity

我正在尝试让我的代码更具动态性。我有一个包含以下内容的文件:

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

当我找到所有b1时,我会列出这样的列表:

[b1, b2, b3].

当文件中的arity发生更改时,例如,当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).

2 个答案:

答案 0 :(得分:0)

如果更改了arity,则应将参数放在列表中并使用nth1/3

类似的问题here btw

答案 1 :(得分: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).