Получить неограниченные границы доменов с C# SWI-Prolog DLL

Я использую 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.

Теперь мне интересно, как получить этот результат в C# порте SWI-Prolog. призвание query.SolutionVariables[0]["V1"] или же query.SolutionVariables[0]["V2"] дай мне промежуточные переменные.

Для V1 я мог бы использовать стратегию маркировки (res(X,L) :- setof(X, indomain(X), L).), но это не будет работать для V2, поскольку оно соответствует неконечной области.

Итак, в двух словах, как я могу получить не ограниченную информацию о домене для переменной решения с C# Swipl DLL?

Заранее спасибо.

1 ответ

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

Другие вопросы по тегам