2013-12-16 2 views
2

Я не знаю, как я могу достичь следующего:Пролог подсчет с ограничениями

Я хочу, чтобы подсчитать количество раз, определенное условие (чьи значения неизвестны) выполняется.

Например, если у меня есть списки [A1,A2,A3] и [B1,B2,B3], как я могу создать список [R1,R2,R3] где Ri является 1 если Ai=Bi и 0, если нет.

Это основа «программы».

:- use_module(library(clpfd)). 

main(A,B) :- 
    length(A,3), 
    domain(A,1,3), 
    all_different(A), 
    length(B,3), 
    domain(B,1,3), 
    all_different(B), 

    append(A,B,L), 
    labeling([],L). 

ответ

1

вы должны 'материализовать' свои условия, размещая ограничения формы

материализовать (A, B, C): - C# < ==> A # = B.

между парами переменных. MapList/3 Это удобный контекстное

:- use_module(library(clpfd)). 

% simulate domain/3 in SWI-prolog 
domain(Vs,L,H) :- Vs ins L..H. 

reify(A,B,C) :- 
    C#<==> A #= B. 

main(A,B,C) :- 
    length(A,3), 
    domain(A,1,3), 
    all_different(A), 
    length(B,3), 
    domain(B,1,3), 
    all_different(B), 

    maplist(reify, A,B,C), 
    labeling([],A), 
    labeling([],B). 

дает

1 ?- main(A,B,C). 
A = B, B = [1, 2, 3], 
C = [1, 1, 1] ; 
A = [1, 2, 3], 
B = [1, 3, 2], 
C = [1, 0, 0] ; 
A = [1, 2, 3], 
B = [2, 1, 3], 
C = [0, 0, 1] 
etc .... 
Смежные вопросы