Prolog найти элемент в списке списков с предпочтением

У меня есть список списков, как:

L = [[Q,w,E,],[Q,w,Z,r],[A,s,D,f]]

Я знаю первые два, и мне нужно получить остальные.
Например, у меня есть Q,w,и мне нужно получить Z, r или E, r.
Я хотел бы как-то сказать, что с приоритетом я всегда хочу,чтобы touple содержал Z, но если не существует, дайте мне E, r.

Я пытался:

member([Q,w,Z,VB],[[Q,w,E,o],[Q,w,Z,r],[A,s,D,f]]).

Но это всегда дает мне Z = E, VB = o

1 ответ

  1. Сначала вам нужно знать разницу в прологе между атомом и переменной, вы можете прочитать об их синтаксисе здесь
    Теперь, если вы хотите список атомов, которые начинаются с заглавной буквы, вы должны заключить их в одинарные кавычки, иначе prolog будет интерпретировать их как переменные.
    Теперь, если вы исправите синтаксис вашей консультации, вы получите следующий результат:

    ?- member(['Q',w,Z,VB],[['Q',w,'E',o],['Q',w,'Z',r],['A',s,'D',f]]).
    
    VB = o,
    Z = 'E'
    VB = r,
    Z = 'Z'
    false
    

    Обратите внимание, как в этом случае я заключил в единственную кавычку все атомы, начинающиеся с заглавной буквы, за исключением Zи VBв первом аргументе member/2предиката, заставляют в этом случае они действуют как переменные, которые создаются прологом с атомами, необходимыми для завершения этого случая.