【问题标题】:Set parameters dynamically in Prolog在 Prolog 中动态设置参数
【发布时间】:2011-05-12 08:10:31
【问题描述】:

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

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).

【问题讨论】:

标签: list file prolog predicate arity


【解决方案1】:

如果数量发生变化,您应该将参数放在一个列表中并使用nth1/3

类似问题herebtw

【讨论】:

    【解决方案2】:
    
    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).
    

    【讨论】:

    • 您好,感谢您的回答。但我有一个问题。怎么可能
    猜你喜欢
    • 1970-01-01
    • 2023-01-10
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多