LINUX.ORG.RU

Простая задачка по прологу

 ,


0

1

Всем привет!
В университете задали несколько задач по прологу. В функциональщине я слабоват и осилил набросать следующий не рабочий код:

Predicates
    age(symbol, integer)
    nondeterm can_drive(symbol).
    one_time(какой тип/домен указать тут?)
	
Clauses
	age(mary,16).
	age(brain,17).
	age(kate,15).
	age(susan,15).
	can_drive(kate).
	can_drive(mary).
	can_drive(brain).
	one_time(age(X,Y)):-age(X,Y),!.

Goal
	can_drive(X), age(X,Y), Y>=16.

Сама задачка звучит так:
Имеются факты:
возраст(мери,16).
возраст(брайен,16).
возраст(кейт,17).
возраст(сюзан,15).
шоферские_курсы(кейт).
шоферские_курсы(мэри).
шоферские_курсы(брайен).
один_раз(возраст(X,Y)):-возраст(X,Y),!.

Оцените полноту множества ответов и эффективность выполнения для каждого из приводимых составных запросов.
1) шоферские_курсы(X),возраст(X,Y), Y>=16. брайен,16
2) шоферские_курсы(X),!,возраст(X,Y),Y>=16.
3) шоферские_курсы(X),возраст(X,Y),!,Y>=16.
4)шоферские_курсы(X),один_раз(возраст(X,Y)), Y>=16.

Вот у меня и загвоздка в непонимании что это такое «один_раз» (one_time предикат) - может это встроенный предикат в Пролог?

Собственно вопрос: какой тип надо указать предикату one_time если он получает в кач-ве аргумента результат выполнения другого предиката

UPD: решение

domains
	mydomain = age(symbol, integer)

Predicates
	age(symbol, integer)
    	nondeterm can_drive(symbol)
    	one_time(mydomain)
	
Clauses
	age(mary,16).
	age(brain,17).
	age(kate,15).
	age(susan,15).
	can_drive(kate).
	can_drive(mary).
	can_drive(brain).
	one_time(age(X,Y)):-age(X,Y),!.

Goal
	can_drive(X), age(X,Y), Y>=16.


он получает в кач-ве аргумента результат выполнения другого предиката

В прологе логика первого порядка :)

buddhist ★★★★★ ()

«один_раз» у тебя в условии определен. Алсо, в прологе нет типов и он не имеет отношения к функциональщине.

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

под типами я подразумевал домен.

Если не указать домен для предиката can_driveполучаю ошибку:

E;Test_Goal, pos: 231, 209 Illegal number of arguments: refer to declaration one_time

если указать заведомо неверный домен one_time(symbol) получаю:

E;Test_Goal, pos: 228, 512 Type error: Wrong object type

duck ()

Ты чем пользуешься? Вот портянка для SWI-Prolog:

age(mary, 16).
age(brian, 16).
age(kate, 17).
age(susan, 15).

drive(kate).
drive(mary).
drive(brian).
onceonly(age(X, Y)) :-
	age(X, Y),!.

Ответы на вопросы найди сам, trace в помощь. Или пиши в Job :)

buddhist ★★★★★ ()

Мне не совсем понятно, почему в некоторых универах упорно студентам дают Visual Prolog (это ведь он?) вместо нормального пролога.

Собственно вопрос: какой тип надо указать предикату one_time если он получает в кач-ве аргумента результат выполнения другого предиката

У тебя тут фундаментальное непонимание, как работает пролог. У предикатов в прологе нет «результата выполнения», в том смысле, в котором о нём принято говорить в большинстве языков программирования.

Ответ на твой вопрос попробую нагуглить, но ничего не обещаю, т.к. с Visual Prolog почти не сталкивался.

Вот у меня и загвоздка в непонимании что это такое «один_раз» (one_time предикат) - может это встроенный предикат в Пролог?

Нет, он у тебя самого и определён:

один_раз(возраст(X,Y)):-возраст(X,Y),!.

К слову, в прологе есть once/1, который делает то же самое, только «правильно».

runtime ★★★★ ()
Последнее исправление: runtime (всего исправлений: 1)
Ответ на: комментарий от runtime

Да, это визуал пролог.

У тебя тут фундаментальное непонимание, как работает пролог.

once - предиката в визуал прологе нет:

E;Test_Goal, pos: 198, 404 Undeclared predicate, misspelling or not supported on chosen platform once

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

Так не захотел, но это подтолкнуло меня на создание такого домена mydomain :

domains
mydomain = age(symbol, integer)

Predicates
    age(symbol, integer)
    nondeterm can_drive(symbol)
    one_time(mydomain)

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

Мне не совсем понятно, почему в некоторых универах упорно студентам дают Visual Prolog (это ведь он?) вместо нормального пролога.

ты бы еще спросил почему дают turbo pascal, turbo c, visual basic, .net, java, x86 ассемблер. а все документы принимают только в виде word файлов.

exception13 ★★★★★ ()

кстати swi prolog отлично умеет в utf8 и можно факты и запросы не переписывать.

exception13 ★★★★★ ()

Вот у меня и загвоздка в непонимании что это такое «один_раз» (one_time предикат)

is_not_gay(X) :- one_time(X).

Сорри, не удержался. :)

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

Мне не совсем понятно, почему в некоторых универах упорно студентам дают Visual Prolog (это ведь он?) вместо нормального пролога.

у меня был хардкорный Turbo Prolog восемьдесяткакого-то года выпуска, 86 кажется :)

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