在Prolog中,我经常通过提供一个模板(包含变量的结构)并在其上满足一组约束条件来解决问题。一个简单的例子可能是:
请注意,我的问题不涉及列表相关的约束条件,即使是用于约束的参数也不能总是轻松生成为列表以传递到像上面使用的相对简单的帮助谓词中。实际上,我发现这个辅助谓词是一个相当笨拙的谓词,每次都需要编写:
1. 接受一个模板、几个用于约束的参数(因此将模板的变量绑定到有用的值)、用于指示当前进行到哪个约束的变量。 2. 生成要在此迭代中满足的约束,并将其应用于模板。 3. 递归调用自身,以便可以满足剩余的约束。
我正在寻找的是一种类似于“findall”等的谓词,它将按顺序满足一组目标。例如:
我所需要的答案并不一定是这种形式。事实上,回溯一个目标和维护由此产生的每个绑定集之间可能存在矛盾。
我希望我已经解释清楚了我的问题,因此可以帮助到我。如果没有,请告诉我。提前为冗长的问题道歉!
更新(两年后)
我会在今天晚些时候试一下,并更新我的问题!
请注意,我从未说过我会在尝试后的同一天更新问题。 ;-)
@CapelliC指导了我正确的方向,我找到了一个似乎运作良好的模式:
go(T) :-
T = [_, _, _],
member(cat, T),
member(dog, T),
member(mouse, T).
实际应用中,约束集不是固定的,而是通过其他方式生成的。我需要编写一个递归谓词来逐个满足每个约束条件:
go(T) :-
T = [_, _, _],
findall(A, animal(A), As),
% satisy member(A, T) for each A in As
fill_in_animals(T, As)
fill_in_animals(T, []).
fill_in_animals(T, [A|Rest]) :-
member(A, T),
fill_in_animals(T, Rest).
请注意,我的问题不涉及列表相关的约束条件,即使是用于约束的参数也不能总是轻松生成为列表以传递到像上面使用的相对简单的帮助谓词中。实际上,我发现这个辅助谓词是一个相当笨拙的谓词,每次都需要编写:
1. 接受一个模板、几个用于约束的参数(因此将模板的变量绑定到有用的值)、用于指示当前进行到哪个约束的变量。 2. 生成要在此迭代中满足的约束,并将其应用于模板。 3. 递归调用自身,以便可以满足剩余的约束。
我正在寻找的是一种类似于“findall”等的谓词,它将按顺序满足一组目标。例如:
% satisfyall(:Goal)
% backtracks on Goal but keeps all bindings from each fully satisfied goal.
satisfyall((animal(A), member(A, T)))
我所需要的答案并不一定是这种形式。事实上,回溯一个目标和维护由此产生的每个绑定集之间可能存在矛盾。
我希望我已经解释清楚了我的问题,因此可以帮助到我。如果没有,请告诉我。提前为冗长的问题道歉!
更新(两年后)
我会在今天晚些时候试一下,并更新我的问题!
请注意,我从未说过我会在尝试后的同一天更新问题。 ;-)
@CapelliC指导了我正确的方向,我找到了一个似乎运作良好的模式:
?- Gs = [member(red),member(blue)], T = [_,_], foreach(member(G, Gs), call(G, T)).
T = [red, blue] ;
T = [blue, red] ;
apply(G,[T])
已经过时了!请使用call(G,T)
。 - false