Пролог — Превращение списка в список предложений

Я пытаюсь использовать метапрограммирование и DCG, чтобы превратить список в список предложений, используя Prolog. Например, я хотел бы превратить [a, man, is, a, human] в [ (human(X) :- man(X))]

Я подумал, что могу использовать =.. для составления терминов из списка их составных частей. Например, вызов Term =.. [f,a,b,c] свяжет Term с f(a,b,c).

Моя проблема заключается в попытке объединить это с помощью DCG. До сих пор я использовал DCG, чтобы проверить правильность формы предложения:

 %% syllogism( +S )
  % Holds if the sentence S is one of four syllogisms

  % a B is a C
  syllogism  --> article, subject, is_, (article ; [] ), subject .

  % some B is a C 
  syllogism  --> some, subject, is_, (article ; [] ), subject .

  % no B is a C
  syllogism  --> no, subject, is_, (article ; [] ), subject .

  % some B is not a C
  syllogism  --> some, subject, is_, not, (article ; [] ), subject .

  subject   --> [X] .
  some      --> [some] .
  is_       --> [is] .
  article   --> [a] .
  article   --> [every] .
  not       --> [not] .
  no        --> [no] .

Однако я пытаюсь изменить это, чтобы я мог составить список предложений, все еще полагаясь на DCG.

РЕДАКТИРОВАТЬ: В основном то, чего я пытаюсь добиться, - это взять список L и создать список предложений: [a, man, is, a, human] должен производить [man(X) :- human(X)]

Аналогично: [нет, В, есть, а, С] должно давать [ (ложь :- В(Х),С(Х))]

Спасибо за ваше время.


person JB2    schedule 20.11.2012    source источник
comment
В большинстве случаев не рекомендуется использовать (=..)/2 непосредственно в программе. Вместо этого вы можете дать бетонные конструкции.   -  person false    schedule 21.11.2012
comment
Правило subject --> [X]. означает, что субъектом может быть что угодно. Это предназначено?   -  person false    schedule 21.11.2012
comment
Метапрограммирование — это как раз тот случай, когда необходимо использовать =...   -  person liori    schedule 21.11.2012
comment
Хорошо спасибо. Как мне лучше всего использовать DCG и =..? Я понимаю, что (например) p(X, Y) --> q(X), r(X, Y), s(Y). переводится как: p(X, Y, Вход, Выход): - q(X, Вход, Выход1), r(X, Y, Выход1, Выход2), s(Y, Выход2, Выход). Однако как мне назначить что-то на вывод?   -  person JB2    schedule 21.11.2012
comment
@false: нет, не совсем. Я пытаюсь выразить следующие правила: B есть C =====› [ (C(X) :- B(X)) ] некоторый B есть C =====› [ (B( some(B,C)) :- true) some B не является C =====› [ (B( some(B,not(C)) ):- true), (false :- C( some( B,not(C)) )) ] т.е. [человек есть человек] =====› [ (человек(X) :- мужчина(X)) ] и т.д.   -  person JB2    schedule 21.11.2012
comment
Вы можете добавить аргумент для этого имени. нет смысла делать его слишком общим.   -  person false    schedule 21.11.2012
comment
@user1796218 user1796218 Сначала вам нужно изложить свои факты, а затем вы можете аргументировать. Если вы хотите сказать, что человек является человеком, сначала вы должны определить мужчин: мужчины(X):-член(Х, [мужчины1, мужчины2, мужчины3]). Затем вы утверждаете, что каждый человек является человеком, как человек( X) :- men(X)., так что вы сможете спросить человека(men1) и получить правильный ответ.   -  person Rubens    schedule 21.11.2012
comment
@Rubens: Да, но я не хочу этого делать :)   -  person JB2    schedule 21.11.2012
comment
Я хочу что-то вроде: силлогизм (C) --> статья, тема (L1), is_, (статья; []), тема (L2), добавление (L1, L2, C). предмет( [L] ) --› L =.. [X, Y], земля( X ) . некоторые --› [некоторые] . is_ --› [есть] . артикль --› [а] . артикль --› [каждый] . нет нет] . нет нет] .   -  person JB2    schedule 22.11.2012


Ответы (1)


Похоже, вам понадобится мета-интерпретатор http://ktiml.mff.cuni.cz/~bartak/prolog/meta_interpret.html

В конечном счете все проблемы в Прологе сводятся к использованию правильного метаинтерпретатора.

person Steve    schedule 18.01.2013