Fakty są wymienione poniżej. Wydaje się, że nie mogę stworzyć odpowiedniej reguły o nazwie Neneighbors, co zwraca wszystkie litery, które nie są sąsiadem dla danego listu. Lub nie masz relacji sąsiedztwa (x, y) z daną literą.

neighborletters(a,b,beggining_letters).
neighborletters(b,a,beggining_letters).
neighborletters(j,k,middle_letters).
neighborletters(k,j,middle_letters).
neighborletters(x,y,last_letters).
neighborletters(y,x,last_letters).

Do tej pory wymyśliłem poniższą zasadę i wiele innych odmian.

notneighbor(X,Y):-    
    neighborletters(A,B, _),
    neighborletters(B,A, _),
    X \= A,
    Y \= B.

Ale kiedy robię zapytanie z powyższą zasadą.

?- notneighbor(a, X).

Zamiast pożądanych zwrotów otrzymuję fałszywe

j 
k  
x  
y
1
Isse Nur 1 grudzień 2019, 01:30

1 odpowiedź

Najlepsza odpowiedź

W twoim zapytaniu, notneighbor(a, X), drugi argument nie jest instancji. Dlatego ostatni cel w twojej regule, Y \= B, jest fałszywy jako zmienna może być zawsze zjednoczona z dowolnym terminem. Spróbuj zamiast tego:

neighbor_letters(a, b, beggining_letters).
neighbor_letters(b, a, beggining_letters).
neighbor_letters(j, k, middle_letters).
neighbor_letters(k, j, middle_letters).
neighbor_letters(x, y, last_letters).
neighbor_letters(y, x, last_letters).

not_neighbor(X, Y):-    
    neighbor_letters(X, _, _),
    neighbor_letters(Y, _, _),
    X \== Y,
    \+ neighbor_letters(Y, X, _),
    \+ neighbor_letters(X, Y, _).

To da ci:

| ?- not_neighbor(a, X).

X = j ? ;
X = k ? ;
X = x ? ;
X = y
yes

Ta definicja predykatu not_neighbor/2 może również zwrócić pary liter, które nie są sąsiadami:

| ?- not_neighbor(X, Y).

X = a
Y = j ? ;
X = a
Y = k ? ;
X = a
Y = x ? ;
X = a
Y = y ? ;
...

Nadal problem z nią zwraca powielane odpowiedzi. Na przykład.

| ?- not_neighbor(b, y).

yes
| ?- not_neighbor(y, b).

yes

Czy to problem? Jeśli tak, możesz rozwiązać to kontynuowanie?

1
Paulo Moura 1 grudzień 2019, 00:40