LINUX.ORG.RU

Prolog, consult не грузит правила

 , ,


0

1

Есть лаба.
Тема - динамические базы знаний.
по-хорошему, есть меню типа

mainMenu(add)  :- add .
mainMenu(del)  :- del .
mainMenu(save) :- save .
mainMenu(show) :- show .
mainMenu :-
	write('Enter action add/del/save/show: '),
	read(Action),
	mainMenu(Action).
и есть файл, назовем его base.pro с содержанием
phone('Андрей',		'Андреич',		'00-00-00'). 
phone('Борис',		'Борисыч',		'11-11-11').
phone('Володя',		'Володич',		'22-22-22').
phone('Генадий',	'Генадич',		'33-33-33').
phone('Денис',		'Денисыч',		'44-44-44').
phone('Евлапий',	'Евлапич',		'55-55-55').
phone('Жора',		'Жорович',		'66-66-66').
phone('Зиновий',	'Зиновьевич',	'77-77-77').
phone('Илья',		'Ильич',		'88-88-88').
phone('Константин',	'Константиныч',	'99-99-99').


так вот если его грузить или в лабе, или в шелле, то вроде и ошибки нет, но и правила не грузятся.
конкретно в шелле consult('base.pro') говорит true, но ничего не меняется.
знаю, что есть еще функция ['file'], но она не то, с ней пролог говорит, что не может добавлять правила через assertz

так вот вопрос. Как, блин, заставить его съесть этот файл(base.pro) так, чтобы были видны правила?

про меню написал, потому что в правиле mainMenu/0 стоял раньше consult, но это ничего не меняло

ах да, гуглится только офф мануал по языку, а там 2 строчки написано с описанием фукнции и больше ничего

версия интерпретатора: swi-prolog 6.2.6

★★★

Последнее исправление: ii343hbka (всего исправлений: 3)

но ничего не меняется

Как удалось определить? И желательно указать реализацию пролога.

anonymous
()
Ответ на: комментарий от anonymous

ну вот запустил я эту радость в шелле, она сказала

8 ?- consult('base.pro').
true.

потом я говорю
9 ?- phone(N,S,P).
ERROR: toplevel: Undefined procedure: phone/3 (DWIM could not correct goal)


листинг base.pro есть в начальном посте

ii343hbka ★★★
() автор топика

нашел закономерность.
такая фигня приключается, если сделать consult('lab.pro'), а потом уже консульт с правилами с телефонами.
если отдельно телефоны, то все норм.

короче нифига я не понимаю этот язык :( Возьму лабу у однокурсницы, она ее как-то сделала

ii343hbka ★★★
() автор топика
Ответ на: комментарий от ii343hbka

Ну это же оболочка, она не обязана поддерживать все. Вроде swiprolog умеет грузить с помощью опции "-s".

anonymous
()
Ответ на: комментарий от ii343hbka

В самой же программе consult работает. А оболочка - вторична.

короче нифига я не понимаю этот язык

Term unification (фича) + Backtracking (в меньшей степени: несложно может быть реализована в других языках)

anonymous
()

Ты странный какой-то и не читаешь документацию поэтому.

*@*:~/*$ cat base.pl
phone('Андрей',         'Андреич',              '00-00-00').
phone('Борис',          'Борисыч',              '11-11-11').
phone('Володя',         'Володич',              '22-22-22').
phone('Генадий',        'Генадич',              '33-33-33').
phone('Денис',          'Денисыч',              '44-44-44').
phone('Евлапий',        'Евлапич',              '55-55-55').
phone('Жора',           'Жорович',              '66-66-66').
phone('Зиновий',        'Зиновьевич',   '77-77-77').
phone('Илья',           'Ильич',                '88-88-88').
phone('Константин',     'Константиныч', '99-99-99').

*@*:~/*$ swipl
% library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 2,224 bytes
Welcome to SWI-Prolog (Multi-threaded, 32 bits, Version 5.10.4)
Copyright (c) 1990-2011 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- [base]
|    .
% base compiled 0.00 sec, 2,740 bytes
true.

?- phone('Андрей', X, Y).
X = 'Андреич',
Y = '00-00-00'.

?- 

auto12884839
()
Ответ на: комментарий от auto12884839

или так, если у тебя .pro вместо честного .pl:

?- ['base.pro'].
% base.pro compiled 0.00 sec, 2,740 bytes
true.

?-  phone(Z, X, Y).
Z = 'Андрей',
X = 'Андреич',
Y = '00-00-00' .
auto12884839
()
Ответ на: комментарий от auto12884839

Честно написал, что хочет странного еще в теме:

но она не то, с ней пролог говорит, что не может добавлять правила через assertz

anonymous
()

седня с утра осенило :)
моя ошбика была в корявом формулировании задания.
теперь правильнее
тема: диманические базы данных/знаний на Прологе. Т.е. есть программа, в ней есть предопределенные факты и есть правила для добавления/удаления фактов.

я так понял, что в самом верху мы грузим правила из файла, а потом пишем правила для добавления/удаления/etc.
у меня получилось так:

%% lab6. динамические базы данных
:- dynamic phone/3.
:- consult('base.pro').

%
printRecord(Name, Surname, Phone) :- 
	write(Name), write(' '), write(Surname), write(' : '), write(Phone), nl, fail.

%
add :-
	write('Enter name: '),
	read(Name),
	write('Enter surname: '),
	read(Surname),
	write('Enter phone number: '),
	read(Phone),
	assertz( phone(Name, Surname, Phone) ),
	mainMenu .

%
del(name) :-
	write('Enter name: '),
	read(Name),
	retract(Name).
del(surname) :- 
	write('Enter surname: '),
	read(Surname),
	retract(Surname).
del(phone) :-
	write('Enter phone: '),
	read(Phone),
	retract(Phone).
del :-
	write('Enter deletion criteria name/surname/phone: '),
	read(Criteria),
	del(Criteria),
	mainMenu .

%
save .

%
show :-
	phone(Name, Surname, Phone),
	printRecord(Name, Surname, Phone),
	mainMenu .

%
mainMenu(add)  :- add .
mainMenu(del)  :- del .
mainMenu(save) :- save .
mainMenu(show) :- show .
mainMenu :-
	write('Enter action add/del/save/show: '),
	read(Action),
	mainMenu(Action).


а ошибка с неподгрузкой была в том, что я писал просто consult(), а надо было :- consult().
И dynamic тоже обязателен, из-за него невозможно добавлять/удалять правила.

всем спасибо :)

ii343hbka ★★★
() автор топика
Ответ на: комментарий от ii343hbka

я так понял, что в самом верху мы грузим правила из файла, а потом пишем правила для добавления/удаления/etc.

Ты вообще напрасно так поступаешь. На swi прологе это лучше сделать так:

        csv_read_file('phones.csv',[_|Rows],[functor(phone),arity(3)]),
        maplist(assert,Rows).

И тогда факты могут быть изложены в обычном csv файле. Первая строка игнорируется потому что там заголовок.

auto12884839
()
Ответ на: комментарий от auto12884839

ну у нас в задании так.
да и документацию я по прологу не умею читать.
но спасибо. Скоро делать обертку на c++/c#. Там, думаю, можно будет из csv грузить правила

ii343hbka ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.