我正在使用Swi-Prolog Csharp DLL和CLP(FD)。 我有以下Prolog文件:
:- use_module(library(clpfd)).
constr(V0,V1,V2,C0,C1,C2) :-
((V0 #= 1901) #\/ (V0 #= 1750)) #<==> C0,
((V1 #= 3) #\/ (5 #= V1)) #<==> C1,
((V2 #>= 1)) #<==> C2.
config(V1,V2) :- constr(1750,V1,V2,1,1,1).
V0,V1,V2是我的变量。 C0,C1,C2是我的约束修正变量。
调用config(V1,V2).
时,我想获取V1和V2域值,以便满足所有约束。
在SWI-Prolog界面中使用时,我得到:
1 ?- config(V1,V2).
V1 in 3\/5,
V2 in 1..sup.
现在,我想知道如何在SWI-Prolog的C#端口中获得此结果。
呼叫query.SolutionVariables[0]["V1"]
或query.SolutionVariables[0]["V2"]
给了我中间变量。
对于V1,我可以使用标签策略(res(X,L) :- setof(X, indomain(X), L).
),但这不适用于V2,因为它对应于非有限域。
因此,简而言之,如何使用C#Swipl DLL获得解决方案变量的非有限域信息?
谢谢。
答案 0 :(得分:0)
?- Goal_0 = config(V1,V2), Goal_0, copy_term(Goal_0, Goal_0, C_0s).
Goal_0 = config(V1, V2),
C_0s = [clpfd:(V1 in 3\/5), clpfd:(V2 in 1..sup)],
V1 in 3\/5,
V2 in 1..sup.
因此,使用copy_term/2
来附加所有约束。然后使用通用术语ffi。