使用C#SWI-Prolog DLL获取非有限域边界

时间:2018-12-03 10:29:23

标签: prolog swi-prolog clpfd

我正在使用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获得解决方案变量的非有限域信息?

谢谢。

1 个答案:

答案 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