我像这样使用 swi prolog 和我的代码。 我从文件中读取数据谓词,其 arity 计数可能会更改。我怎么能概括它。例如,如果数据(a1,b1,c1)写入文件,如何找到解决方案?你有什么想法吗?
> basla:-consult('test.pl'),
> answer(L1,L2,L3,L4,L5),
> list_to_set(L1, X),
>
> write(X).
> answer(L1,L2,L3,L4,L5):-
> findall(First, data(First,_,_,_,_),L1),
> findall(Second, data(_,Second,_,_,_),L2),
> findall(Third, data(_,_,Third,_,_),L3).
如果谓词的arity似乎发生了变化,那么几乎总是更好的做法是使其成为arity并给它一个列表参数。然后,可以通过调用 nth1
或 nth0
来扩展findall
查询。
basla(Predicate/Arity) :-
consult('test.pl'),
length(L,Arity),
for(1,Nth,Arity),
findall(A,(
nth1(Nth,L,A),
P =.. [Predicate|L],
call(P)),
LX),
list_to_set(LX,U),
writef('%tn',[U]),
Nth = Arity.
for(B,C,A) :-
A >= B,
for_2(B,C,A).
for(B,C,A) :-
A B,!,
fail.
for_2(A,A,_).
for_2(A,C,D) :-
B is A + 1,
for_2(B,C,D).
basla(谓词/Arity) :- 咨询('测试.pl'), 长度(L,Arity), 对于(1,Nth,Arity), findall(A,( nth1(Nth,L,A), P =..[谓词|L], 呼叫(P)), LX), list_to_set(LX,U), writef('%t',[LX]), 第 N = Arity。