0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 20
1

Как работает код

09.06.2014, 11:57. Показов 1448. Ответов 2
Метки нет (Все метки)

Помогите разобраться в чужом коде (практические навыки в прологе отсутствуют полностью). Особенно интересует работа восклицательного знака (например,
Prolog
1
'решить'(A 'и' B,Rules) :- !,'решить'(A,Rules),'решить'(B,Rules).
) и assert и fail (например,
Prolog
1
'ответить'(y,'не' A,Rules) :- !,assert('ответ'(A,'истина')),fail.
).
///
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
:- op(790, fx, 'если').
:- op(780, xfx, 'то').
:- op(775, xfy, 'или').
:- op(770, xfy, 'и').
:- op(765, fx, 'не').
 
gethow :- !, clause('главнаяцель'(X),MainGoal),'как'(MainGoal),fail.
 
'решить' :-abolish('ответ'/2),'назначениеэкспертнойсистемы'(G),clause('главнаяцель'(X),MainGoal),'решить'(MainGoal),resultwrite(X),!.
 
'известно'('не' A) :- 'ответ'(A,_).
'известно'(A) :- 'ответ'(A,_).
 
'предложение'(A,B) :- 'если' B 'то' A.
'предложение'(A,'истина') :- 'ответ'(A,'истина').
'предложение'('не' A,'истина') :- 'ответ'(A,'ложь').
'предложение'(A,B) :- clause(A,B).
 
'решить'(Goal) :- 'решить'(Goal,[]).
'решить'('истина',_).
'решить'(A 'и' B,Rules) :- !,'решить'(A,Rules),'решить'(B,Rules).
'решить'(A 'или' B,Rules) :- !,('решить'(A,Rules);'решить'(B,Rules)).
'решить'(A,Rules) :-'предложение'(A,B),'решить'(B,['правило'(A,B)|Rules]).
'решить'(A,Rules) :-'можноспросить'(A),not 'известно'(A),'спросить'(A,Answer),'ответить'(Answer,A,Rules).
'можно спросить'('не' A) :- !,'вопрос'(A).
'можно спросить'(A) :- 'вопрос'(A).
 
'спросить'('не' A,Answer) :- !, opros(A,Ans),string_term(Ans,Answer).
'спросить'(A,Answer) :- opros(A,Ans),string_term(Ans,Answer).
 
'ответить'(y,'не' A,Rules) :- !,assert('ответ'(A,'истина')),fail.
'ответить'(y,A,Rules) :- !,assert('ответ'(A,'истина')).
'ответить'(n,'не' A,Rules) :- !,assert('ответ'(A,'ложь')).
'ответить'(n,A,Rules) :- !,assert('ответ'(A,'ложь')),fail.
'ответить'(why,A,[Rule|Rules]) :- !,'вывестиправило'(Rule),'спросить'(A,Answer),'ответить'(Answer,A,Rules).
'ответить'(why,A,[]) :- !,donerule,'спросить'(A,Answer),'ответить'(Answer,A,[]).
'ответить'(hl,A,[]) :- !,halt.
'ответить'(_,A,Rules) :-write($ответьтеy,nили why$),nl,'спросить'(A,Answer),'ответить'(Answer,A,Rules).
 
'вывести правило'('правило'(A,B)) :-showrule(A,B).
 
 
'доказать'('истина','истина').
'доказать'(A 'и' B,(ProofA,ProofB)):-'доказать'(A,ProofA),'доказать'(B,ProofB).
'доказать'(A 'или' B,(ProofA,ProofB)):-('доказать'(A,ProofA);'доказать'(B,ProofB)).
'доказать'(A,(A:-Proof):-'предложение'(A,B),'доказать'(B,Proof).
 
'как'(Goal) :- 'доказать'(Goal,Proof),'интерпретировать'(Proof).
 
'интерпретировать'((Proof1,Proof2)) :- 'интерпретировать'(Proof1),'интерпретировать'(Proof2).
'интерпретировать'(Proof) :-'факт'(Proof,Fact),showfact(Fact,1).
'интерпретировать'(Proof) :-'правило'(Proof,Head,Body,Proof1),showfact(Head,2),'вывести правило1'('правило'(Head,Body)),'интерпретировать'(Proof1).
 
'вывести правило1'('правило'(A,B)) :-showrule1(A,B).
 
'факт'((Fact:-true),Fact).
'правило'((Goal:-Proof),Goal,Body,Proof) :-Proof \= true, 'извлечьтело'(Proof,Body).
 
'извлечьтело'((Proof1,Proof2),(Body1,Body2)) :-!,'извлечьтело'(Proof1,Body1),'извлечьтело'(Proof2,Body2).
'извлечьтело'((Goal:-Proof),Goal).
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2014, 11:57
Ответы с готовыми решениями:

Код написан в Dev C. Не работает в Visual. Как нужно переделать код?
Здравствуйте. Столкнулась с такой проблемой: код был написан в Dev C, но в Visual он выдаёт...

Код выполняемый из студии с пометкой debag, работает не так как уже компилированный код
Здравствуйте, столкнулся с такой проблемой. Код выполняемый из студии с пометкой debag, работает не...

Как работает код?
Здравствуйте. Подскажите пожалуйста как работает код. Dim x(3), y(3), i, i1 As Integer Dim...

Как работает код
using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

2
308 / 61 / 12
Регистрация: 21.12.2011
Сообщений: 290
13.06.2014, 06:53 2
Лучший ответ Сообщение было отмечено Navovvol как решение

Решение

! - отсечение, убирает точку отката слева.
fail - возвращает неуспех.
assert/assertz - добавляет факт в конец фактов. Есть ещё asserta - он добавляет в начало.
Так-то хелп есть у Пролога..
А вообще почитайте книжку по Прологу..
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
33062 / 18417 / 3870
Регистрация: 12.02.2012
Сообщений: 30,956
Записей в блоге: 12
13.06.2014, 11:20 3
Цитата Сообщение от Navovvol Посмотреть сообщение
Помогите разобраться в чужом коде (практические навыки в прологе отсутствуют полностью).
- в этом случае рекомендую не торопиться и начать с простых задач. Пролог - язык очень нетривиальный для традиционного программиста. С наскока не поддается...
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2014, 11:20
Помогаю со студенческими работами здесь

Как работает код?
Я хочу знать, как работает этот код, может объяснить, с комментариями, пожалуйста. Задание: В...

Как работает код
С main вроде все понятно, а что дальше происходит? #include <stdio.h> int main(int t,int...

Как работает код?
'use strict'; let messages = { "Hello, {0}!": "Привет, {0}!" }; function i18n(strings,...

Объясните пожалуйста как работает этот код, как это объяснить преподавателю, кто шарит
Тут вначале понятно, тип матрица 5 на 5, дальше что за переменные? и что за условие в цикле...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru