Как правильно написать предикат (не между) - PullRequest
0 голосов
/ 14 апреля 2011

Я пишу следующий код

testb :-
    X::1..10,
    V1 = 3,
    V2 = 6,
    testbb(X,V1,V2),
    writeln(X).

testbb(X,V1,V2) :-
    (
      count(I,V1,V2),param(X,V1,V2) do 
      X#\=I 
    ).


?- testb.
Yes (0.00s cpu)
_385{[1, 2, 7 .. 10]}

Это работает хорошо, но я думаю, что это не эффективно

Большое спасибо:)

1 Ответ

2 голосов
/ 15 апреля 2011

Вы можете ограничить область X, чтобы она находилась вне диапазона от V1 до V2:

not_between(X, Lower, Upper) :-
     % it is not the case that X is both greater and 
     % equal to Lower, and less than or equal to Upper: 
    #\ ((X #>= Lower) #/\ (X #=< Upper)).

Замените testbb/3 на not_between/3.Это определение гарантирует, что X не может принимать значения Lower и Upper точно;вместо этого вы могли бы использовать ограничения диапазона #< и #>, если хотите, чтобы они были включены в домен для X.

. Это проверено и работает с SWI-Prolog.Чтобы использовать CLP (FD) в файле SWI-Prolog, убедитесь, что вы импортировали библиотеку CLP (FD) в верхней части исходного файла в директиве, например:

:- use_module(library(clpfd)).
...