Пролог проверяет только переменную - PullRequest
0 голосов
/ 05 декабря 2018

В Prolog, можно ли проверить, является ли variable определенным значением, только если переменная instantiated.

? - my_rule(X).

my_rule(X):-
    X = 4,
    write('continue'). 

Здесь я пытаюсь проверить, является ли X is 4, если X is 4, то мы продолжаем, но я также хочу, чтобы правило продолжалось, если X равно _, но когда оно вызывается с чем-то другим, например X is 3, оно не должно продолжаться.

Таким образом, результаты будут выглядеть так:

?- my_rule(X).

continue
true.

?- my_rule(4).

continue
true.

?- my_rule(3).

false.

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Вы можете использовать двойное отрицание (\+(\+(...))):

В вашем примере:

my_rule(X):-
    \+(\+(X = 4)),
    write('continue'). 
0 голосов
/ 05 декабря 2018

Посмотрите на var/1, atom/1 и ground/1:

  • var(X) верно, если и только если X является переменной.

    ? - var (X), X = 1. X = 1.

    ? - X = 1, var (X).false.

    ? - X = f (Y), var (X).false.

  • atom(X) - истина, если X является атомом.

    ? - атом (a).истина.

    ? - атом (f (a)).false.

    ? - атом (X).false.

  • ground(X) - истина, если X заземлено (не содержит переменных).

    ? - заземление (f (a)).true.

    ? - земля (f (X)).false.

Три предиката являются детерминированными (то есть не возвращаются назад), и вы можете смело отрицать их.

Ваш код становится примерно таким:

my_rule(4) :-
   % handle the 4 case
my_rule(X) :-
   var(X),
   % general case

Я просто не уверен, что это то, что вы хотите.В большинстве программ не должно быть необходимости обрабатывать только переменные в отдельности.Также следует помнить, что такие мета-логические тесты выходят за рамки классической логики.Если сравнить запросы X = 1, var(X) и var(X), X = 1, вы увидите, что конъюнкция больше не коммутативна, но в логике A holds B = B ∧ A имеет место.

0 голосов
/ 05 декабря 2018
my_rule(X):-
    check(X),
    write('continue').

% A fact used to check a value.
check(4).

% A predicate that checks if X is unbound, e.g. a variable.
check(X) :-
    var(X).

Проверка желаемых результатов.

?- my_rule(X).
continue
X = 4 ;
continue
true.

?- my_rule(4).
continue
true ;
false.

?- my_rule(3).
false.
...