Даны списки L1,L2,L3. Если конкатенация L1 и L2 - есть префикс L3, то ответ - yes, иначе - no.
Исходный код программы SWI Prolog:
:-op(120,xfy,v).% оператор логического ИЛИ, имеет самый низкий приоритет, бинарный.
:-op(110,xfy,&). %оператор логического И, имеет приоритет выше, бинарный.
:-op(100,fx,^).
p(F):-true_fact(F).
p(^F):-false_fact(F).
p(A v B):-p(A);p(B).
p(A&B):-p(A),p(B).
read_true_facts:-read(F),(not(F=end),assert(true_fact(F)),read_true_facts;F==end).
read_false_facts:-read(F),(not(F=end),assert(false_fact(F)),read_false_facts;F==end).
main:- write('Vveidte imena istinnih faktov. Posle imeni stavitsya tochka. Po okonchanii vvedite end.'),nl,read_true_facts,
write('Vveidte imena loznih faktov. Posle imeni stavitsya tochka. Po okonchanii vvedite end.'),nl,read_false_facts,
write('Vvedite logicheskoe virazenie: '),read(V),(p(V),write('Ono istinno!');not(p(V)),write('Ono lozno!')).
%?- main.
% Vveidte imena istinnih faktov. Posle imeni stavitsya tochka. Pookonchanii vvedite end
%|: a.
%|: end.
% Vveidte imena loznih faktov. Posle imeni stavitsya tochka. Pookonchanii vvedite end
%|: b.
%|: c.
%|: end.
%Vvedite logicheskoe virazenie: (a v c)& ^b.
%Ono istinno!
%true
a(A,B,C):-append(A,B,Begin),append(Begin,_,C).%esli mozno ispolzovat vstroennii predicat sliyaniya
app([],B,B).%esli nelzya ego ispolzovat. Togda 1 i 3 pravilo opredelyayut ego.
%A vtoroe dlya togo, chtobi rezultat cliyaniya bil prefiksom, a ne imenno tretim parametrom
app([],B,C):-app(B,_,C).
app([H|Tail],B,[H|NewTail]):-app(Tail,B,NewTail).
Описание:
=-Op(120,xfy,v).% оператор логического ИЛИ, имеет самый низкий приоритет, бинарный.
=-Op(110,xfy,&). %оператор логического И, имеет приоритет выше, бинарный.
=-Op(100,fx,^).
предикат main просто вызывет предикат считывания истинных фактов, потом предикат считывания
ложных фактов, а потом запрашивает само логическое выражени.
предикат считывания истинных фактов считывает слово, если оно не равно end, то засонит в
баззу данных факто вида true_fact(F) и рекурсивно продолжает считывание, в противном случае завершает считывание
read_true_facts:-read(F),(not(F=end),assert(true_fact(F)),read_true_facts;F==end).
предикат считывания ложных фактов отличается только видом заносимых в базу фактов
p(F):-true_fact(F).
p(^F):-false_fact(F).
p(A v B):-p(A);p(B).
p(A&B):-p(A),p(B).
что касается предиката со слиянием... если можно пользоваться встроенных предикатом слияния append
a(A,B,C):-append(A,B,Begin),append(Begin,_,C).
то просто сливаем предикаты А и В и смотрим чтобы результат
этого слияния при слиянии еще с чем-либо(неважно с чем, поэтому безымянная переменная) образовывал третий параметр
если нельзя им пользоваться, то просто немного видоизменим реализацию стандартного предиката слияния
стандартная реализация выглядит так
app([],B,B). (1)
app([H|Tail],B,[H|NewTail]):-app(Tail,B,NewTail). (3)
А чтобы у третьего параметра мог оставаться еще хвост, то вводим еще правило
app([],B,C):-app(B,_,C). (2)
Т.е при вызовен предиката будет сначала выполняться правило 3, до тех пор пока первый
параметр не станет пустым, потом вызоветься 2 правило (если кончено изначально при вызове
третий список не был точным результатом конкатенации). А после этого начнет обыкновенная
стандартная работа предиката append, для этого и нужно 1 правило.
Очень часто программисту нужно http://probeg.ucoz.ru авто. |