предикат пролога возвращает факты (?) - PullRequest
0 голосов
/ 03 декабря 2018

Прежде всего, если ответ на мой вопрос здесь или здесь Я не смог его найти, поэтому, пожалуйста, не убивайте меня.

IЯ хочу написать предикат Prolog, который возвращает список этой формы:

(list[elem, elem2], list[elem3, elem4], list[elem5, elem6]).  

Теперь я могу придумать несколько способов вернуть список этой формы:

([elem, elem2], [elem3, elem4],[elem5, elem6]).

, но как это сделать?Я заставляю слово "список" появляться там же?что это вообще такое?факт?другой предикат?

Заранее спасибо!

Ответы [ 2 ]

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

Этот

(list[elem, elem2], list[elem3, elem4], list[elem5, elem6]).  

недопустим в Прологе.

[] означает, что это список, поэтому он не может быть фактом или предикатом, что означает, что вы не можетепоместите имя функтора перед [.

(A,B,C) известно как кортеж в других языках программирования или структура в Prolog.

Если вы хотите использоватьмножественный список в структуре в Прологе вы можете думать о нем как о

(A,B,C)

, где A, B и C. могут быть списками.

Примеры со значениями

([],[],[])
([a],[b],[c])
([],[a,b,c],[d,e,g])

или для вашего конкретного случая

([elem1,elem2],[elem3,elem4],[elem5,elem6])

Вы также можете создать составной термин

list(A,B,C)

Примеры со значениями

list([],[],[])
list([a],[b],[c])
list([],[a,b,c],[d,e,g])
list([elem1,elem2],[elem3,elem4],[elem5,elem6])

Помните, что список - это на самом деле термины в сочетании с оператором cons или ./2 и является синтаксическим сахаром .Это можно увидеть, используя write_canonical/1 с GNU Prolog.

?- write_canonical(([1,2],[3,4],[5,6])).

','('.'(1,'.'(2,[])),','('.'(3,'.'(4,[])),'.'(5,'.'(6,[]))))

или

?- write_canonical(list([1,2],[3,4],[5,6])).

list('.'(elem1,'.'(elem2,[])),'.'(elem3,'.'(elem4,[])),'.'(elem5,'.'(elem6,[])))

Когда вы пытаетесь использовать слово list в качестве функтора для списка [] Например, list[a,b] вы не можете, потому что в списке уже есть функтор ..Это синтаксический сахар, который скрывает функтор ..Причина, по которой некоторым из нас легко запомнить это, состоит в том, что в таких языках, как Lisp, они все еще используют cons или когда синтаксический сахар для списка не известен парсеру, тогда вы быстро узнаете, как использовать cons.

После комментария от OP

это должно быть [list (elem, elem1), list (elem2, elem3)]

Теперь у вас естьlist [] с условиями списка, являющимися составными терминами list(X,Y)

Это допустимый пролог.

write_canonical([list(elem1,elem2),list(elem3,elem4),list(elem5,elem6)]).

'.'(list(elem1,elem2),'.'(list(elem3,elem4),'.'(list(elem5,elem6),[])))

или для выделения оператора . как

'.'(                          
    list(elem1,elem2),          
   '.'(                         
       list(elem3,elem4),
       '.'(
           list(elem5,elem6),
           []
          )
      )
   )

Обратите внимание, что для каждого . есть два аргумента.Аргументы могут быть структурой или составной структурой, такой как list(elem1,elem2), другой . с двумя аргументами или пустым списком, [].

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

Вы можете создать составной термин, используя стандартный =../3 встроенный предикат.Например:

| ?- Term =.. [list, [1,2,3]].

Term = list([1,2,3])
yes

Но учтите, что синтаксис, который вы пытаетесь использовать, list[elem5, elem6], недопустим.Вы пытаетесь имитировать представление array ?Если это так, может быть, использовать вместо list(elem5, elem6)?Например:

| ?- Term =.. [list, elem5, elem6].

Term = list(elem5, elem6)
yes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...