Получить неограниченные границы доменов с 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.