Переменные для предикатов в метаголе

Следующая программа noMetagolR приведена в:

http://www.doc.ic.ac.uk/~shm/Papers/metagol_gram.pdf стр. 33.

parse(S,G1,G2) :- parse(s(0),S,[],G1,G2).

parse(Q,X,X,G1,G2) :- abduce(acceptor(Q),G1,G2).
parse(Q,[C|X],Y,G1,G2) :- Skolem(P), abduce(delta1(Q,C,P),G1,G3), parse(P,X,Y,G3,G2).

abduce(X,G,G) :- member(X,G).
abduce(X,G,[X|G]) :- not(member(X,G)).

Skolem(s(0)). Skolem(s(1)). ...

Пример запроса:

parse([],[],G1), parse([0],G1,G2), parse([0,0],G2,G3), parse([1,1],G3,G4), parse([0,0,0],G4,G5), parse([0,1,1],G5,G6), parse([1,0,1],G6,G),not(parse([1],G,G)), not(parse([0,1],G,G)).

Подстановки ответов должны возвращать изученную грамматику для четности.

Говорят, что программа работает на Япе. Я обычно использую SWI-prolog. В любом случае, что мне сделать, чтобы они поняли Skolem/1? Предположительно это означает, что Skolem является переменной? Я думал, может быть, использовать =.., но это не работает.

Также сколько Skolem/1 фактов необходимо?


person user27815    schedule 12.08.2015    source источник
comment
Цель Skolem(X) может означать две разные вещи: либо она означает 'Skolem'(X), либо означает call(Skolem,X). Так что это может увеличить путаницу, если вы продолжите использовать этот синтаксис. Вместо этого напишите skolem(X).   -  person false    schedule 15.08.2015
comment
Когда я видел это раньше, я всегда интерпретировал это как «зов (Скулем, X)». Но я раньше не видел фактов о Skolem/1, поэтому не понял, что они делают.   -  person user27815    schedule 15.08.2015


Ответы (1)


в SWI-Prolog вы можете поместить в свой источник директиву

:- set_prolog_flag(allow_variable_name_as_functor,true).

см. current_prolog_flag/2

пример на РЕПЛ:

1 ?- set_prolog_flag(allow_variable_name_as_functor,true).
true.

2 ?- assert(X(1)).
true.

3 ?- X(Y).
Y = 1.
person CapelliC    schedule 12.08.2015
comment
Кто-нибудь знает, как это сделать в япе? - person user27815; 13.08.2015
comment
чтобы быть правдой, я бы просто отредактировал/заменил все Skolem на skolem вместо set_prolog_flag(...). Просто сколем уже не должен быть использован... - person CapelliC; 13.08.2015
comment
Вы знаете, почему тогда они могли использовать сколем, а не сколем? В чем смысл такого способа? - person user27815; 13.08.2015
comment
Ответить нелегко. Поскольку сколемизация лежит в основе технологии, я думаю, что они предпочли обеспечить соблюдение макета и согласованности документа, а не беспокоиться о таких низкоуровневых синтаксических деталях. Действительно, документ выглядит очень интересно, но, кажется, требует знания Пролога и ASP... - person CapelliC; 13.08.2015
comment
Ну, у них есть одна реализация в прологе и одна в asp, поэтому я просто смотрю на пролог для начала :) - person user27815; 13.08.2015