Получить неограниченные границы доменов с C # SWI-Prolog DLL - PullRequest
0 голосов
/ 03 декабря 2018

Я использую 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 Ответ

0 голосов
/ 03 декабря 2018
?- 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 .

...