- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
几天前,我问了一个关于Prolog中基础输入/输出的问题,但是现在我有另一个问题。
我正在大学里做一个有关ITS诊断的Prolog项目。
假设我从一些基本事实入手:
lesion(herpes).
lesion(sifilis).
ampolla(herpes).
inguinal(herpes).
fiber(herpes).
headache(herpes).
picazon(herpes).
secrecion(sifilis).
its(herpes):-lesion(herpes), inguinal(herpes), picazon(herpes), fiber(herpes).
its(herpes):- ampolla(herpes), headache(herpes), picazon(herpes).
its(sifilis):-secrecion(sifilis), lesion(sifilis).
lesion(_)
,然后询问用户:
Do you have any lesion?
如果答案是肯定的,那么事实将是:
lesion(herpes).
最佳答案
编辑:我已经意识到这并不能回答您提出的问题,而是提出了解决该问题的另一种方法。
您想要实现的目标很容易在Prolog中实现,但是我认为从头开始重做您的方法可能很有意义。
Prolog语法源自first order predicate calculus。因此,形式为p(s)
的单个位置谓词的标准读数为“s
为p
”。函子p
被视为谓词,它赋予s
一些品质或属性。这种方法的一个相当常识的扩展是读取事物之间的关系归因较高的谓词(即,更多的参数),因此可以将r(a,b)
读为“a
代表r
与b
的关系”。
在这种共同阅读下,您的事实会说“疱疹是一种病变,梅毒是一种病变,疱疹是一种安波拉,等等……”这没有多大意义。更重要的是,您当前的代码没有定义任何关系,因此无法通过统一获得任何有趣的事实。
您的its/1
规则表现出类似的异常情况,并且可能是被误导的方法(并不是说异常=误导了)。通常,我们将每个谓词都视为表达基本陈述。如果我想说明苏格拉底是凡人的事实,我就写mortal(socrates)
,包括主语和谓语。同样,如果我想表达苏格拉底教柏拉图的关系事实,我会写teaches(socrates, plato)
,包括关系的特征和函子teaches
来描述这种关系。我将its(herpes)
读为“是疱疹”,但尚不清楚“它”指的是什么,也没有任何有关归因于疱疹的关系或属性(property)的信息。
我将为您的程序建议另一种方法,然后提供一些代码以实现所需的输入/输出接口(interface)。
我认为您的事实意味着要描述疾病的症状。我将使用谓词symptom/2
来明确指出这一点,以便symptom(Symptom, Disease)
表示“症状是疾病疾病的症状”:
symptom(lesion, herpes).
symptom(lesion, sifilis).
symptom(ampolla, herpes).
symptom(inguinal, herpes).
symptom(fiber, herpes).
symptom(headache, herpes).
symptom(picazon, herpes).
symptom(secrecion,sifilis).
Symptom
参数的自由变量查询来找出疾病的所有症状:
?- symptom(X, herpes).
X = lesion ;
X = ampolla ;
X = inguinal ;
X = fiber ;
X = headache ;
X = picazon.
Disease
参数中使用自由变量查询来找出特定症状可能指示的疾病:
?- symptom(inguinal, X).
X = herpes.
%% indicate_disease(+Symptoms:List, ?Disease:Atom)
%
% True if all symptoms in the list Symptoms are symptoms of the disease Disease.
%
indicate_disease(Symptoms, Disease) :-
foreach( member(Symptom, Symptoms), symptom(Symptom, Disease) ).
Symptoms
成员的每个
Disease
,
Symptom
是疾病
Symptoms
的症状,则
Symptom
列表中的症状表示疾病
Disease
”。当我的代码读起来像是一个令人讨厌的乏味,完全多余的语句时,我通常会觉得自己处在正确的轨道上。
indicate_disease/2
以包括特定的症状分类:
indicate_disease(Symptoms, herpes) :-
Symptoms = [lesion, inguinal, picazon, fiber].
indications_of(sifilis, [secrecion, lesion]).
indicate_disease/2
以使用此谓词:
indicate_disease(Symptoms, Disease) :-
indications_of(Disease, Symptoms).
?- indicate_disease([lesion, inguinal, picazon, fiber], Disease).
Disease = herpes.
inquire_about_symptoms(Symptoms) :-
user_has_symptoms(Symptoms, [], HasSymptoms),
( indicate_disease(HasSymptoms, Disease)
-> format('You have ~w -- :(~n', [Disease])
; writeln('You are disease free! :)')
).
user_has_symptoms([], HasSymptoms, HasSymptoms).
user_has_symptoms([S|Symptoms], AccSymptoms, HasSymptoms) :-
user_has_symptom(S, Answer),
( Answer == yes
-> NewAccSymptoms = [S|AccSymptoms]
;
Answer == no
-> NewAccSymptoms = AccSymptoms
),
user_has_symptoms(Symptoms, NewAccSymptoms, HasSymptoms).
user_has_symptom(Symptom, Answer) :-
format('Do you have any ~w?~nAnswer "yes" or "no": ', [Symptom]),
read(Answer).
?- inquire_about_symptoms([lesion, inguinal, picazon, fiber]).
Do you have any lesion?
Answer "yes" or "no": yes.
Do you have any inguinal?
Answer "yes" or "no": yes.
Do you have any picazon?
Answer "yes" or "no": yes.
Do you have any fiber?
Answer "yes" or "no": yes.
You have herpes -- :(
indications_of(herpes, [lesion, inguinal, picazon, fiber]).
indications_of(siphilis, [...]).
indications_of(..., ...).
....
indicate_disease(UserSymptoms, Disease) :-
indications_of(Disease, DiseaseSymptoms),
forall(member(Symptom, DiseaseSymptoms), member(Symptom, UserSymptoms)).
DiseaseSymptoms
中存在每个
UserSymptoms
时才起作用。另一种方法可能是使用
sort(List, Sorted)
确保所有症状都在排序列表中,然后仅通过统一列表进行测试。
findall/3
:
indicate_diseases(UserSymptoms, Diseases) :-
findall(Disease,
( indications_of(Disease, DiseaseSymptoms),
forall( member(Symptom, DiseaseSymptoms),
member(Symptom, UserSymptoms) ),
Diseases
).
UserSymptoms
表示
Diseases
,如果
Diseases
是
Disease
的所有值的列表,使得
DiseaseSymptoms
是
Disease
的指示,并且对于
Symptom
列表的所有元素
DiseaseSymptoms
,
Symptom
也是列表的元素
UserSymptoms
。”
findall/3
时,否定结果将是一个空列表,而不是
false
,因为,例如,
?- findall(X, X \= X, Xs).
Y = [].
[]
而不是失败,并且
inquire_about_symptoms/1
中的条件现在看起来更像以下内容:
...
indicate_diseases(HasSymptoms, Diseases)
( Diseases = []
-> writeln('You are disease free! :)~n'
; format('You have ~w -- :(~n', [Diseases])
).
关于prolog - 通过用户输入将参数保存到事实中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23378414/
我有一个测试即将进行,我想澄清两个有关参数的问题。 在我的笔记中指出,将参数传递给函数的推荐方法是使用“按引用传递” const type& x; // for "in" parameters
当我通过 OMG 2.5(Beta)推广的 UML 规范阅读以下概念时: in: Indicates that Parameter values are passed in by the caller
我试图在用户按下 Enter 时触发一个函数。我将此输入设置为只读的原因是限制用户在填充值后修改输入中的值。 该值来自将在点击属性中触发的弹出窗口。问题是 keyup.enter 没有触发该输入。 代
我在jQuery中使用模式弹出窗口控件,该弹出窗口具有由jQuery Tokenize输入插件提供动力的输入文本。问题是,当我在模式弹出文本框中键入内容时, token 化插件的搜索结果显示为隐藏在弹
我有一个问题。当我选中复选框时,系统工作正常,总值发生变化,但一旦我修改文本输入,它就会变为 0。我需要将此文本框输入排除在更改值之外。 这是 html: $15000 $
我正在努力让它发挥作用,但还是有些不对劲。 我想用 CSS 设置提交按钮的样式以匹配我已有的按钮。 风格: input[type="button"], input[type="submit"], b
import java.util.*;; public class selection { Scanner in=new Scanner(System.in); private
这可能是一个非常菜鸟的问题。假设我有一个带宽限制为 100MB/s 的网卡,那么输入/输出带宽是否有可能达到该限制 同时 ?或者我会在任何时候遇到这个不等式:in bandwidth + out ba
看着这个问题,Fill immutable map with for loop upon creation ,我很好奇是什么this表示在 Map(1 -> this) . scala> Map(1
我有这样的东西 一个 乙 问? 是或否 数字 数字或零 我想做的是: 如果 B1 = “Y”,则让用户在 B2 中输入一个数字。 如果 B1 = “N”,则将 B2 中的值更改为零,并且不允许用户在
我有一个包含许多列的表,我想添加 input标题单元格内的字段,但我希望输入适合根据正文内容的宽度。 这是没有 input 的样子领域: 这就是 input 的样子领域: 可以看出,像“index”和
关于为 FTP 客户端设置传出和传入文件夹,您遵循哪些最佳实践(如果有)?我们通常使用“outgoing”和“incoming”,但无论你如何表述方向,它都可以有两种解释方式,具体取决于名称相对于哪一
我正在尝试“求解”给定 d 的 Pell 方程:x^2 - d * y^2 = 1,或者至少我想得到最小的 x > 0 来求解方程。到目前为止,一切都很好。这是我的 Haskell 代码 minX :
我是VS Code的新手,可以使用Ctrl + Enter将代码运行到python交互式窗口中。我希望光标自动移动到下一行,因此我可以逐行浏览代码。 能做到吗? 最佳答案 如this blog pos
我正在创建一个 bool 值矩阵/二维数组,并且我想为 dategrid 推断一种不仅仅是“ANY”的类型。 let yearRange = [2000,2001,2002,2003,2004]; l
我有两个排序的列表,例如 a = [1, 4, 7, 8] b = [1, 2, 3, 4, 5, 6] 我想知道a中的每个项目是否在b中。对于上面的示例,我想找到 a_in_b = [True, T
菜鸟警报 这很奇怪 - 当我编写以下代码时,尝试在 AngularJS 中创建自定义指令: myModule.directive('myTab', function(){ console.lo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
假设我正在使用 gdscript 静态类型,并且对于一个函数参数,我事先不知道我会得到什么。这就是 python 中 typing.Any 的作用。如何使用 gdscript 做到这一点? 似乎 Va
我使用 dropzone 上传多个图像,并且工作正常,直到我想为每个图像插入品牌和网址。 我遇到的唯一问题是,当我要从输入字段获取值时,我会从服务器获取来自字段(品牌、网址)的未定义值,但如果我使用静
我是一名优秀的程序员,十分优秀!