1

我使用 Swi-Prolog 是因为我认为 Prolog 的使用有点奇怪。我之所以这么说是因为除了 Watson,我不知道人们通常使用 Prolog 做什么。

无论如何,我正在制作一个序言程序,用于根据我所说的来定义情绪:

emotion(anxiety,emotion):-
    emotion(anxiety,prime).

emotion(fear,emotion):-
    emotion(anxiety,prime),
    emotion(when,prime),
    emotion(bad,prime).

emotion(horrified,emotion):-
    emotion(surprise,prime),
    (emotion(fear,emotion);emotion(aversion,prime)).

素数是一元的,所以它们不是问题。

我可以找到情绪(X,Y)。这将是我用两个参数定义的所有内容。

问题是如何根据定义找到单词?我可以告诉 prolog 找出所有包含某种焦虑定义的情绪吗?从技术上讲,这将是一种情绪、恐惧和“恐惧”之一的焦虑,因为我通过惊讶和恐惧(这意味着焦虑)或惊讶和厌恶来定义它。

有没有我可以使用的命令,或者我必须编写一些程序才能让 prolog 生成这样的列表?

4

1 回答 1

0

我可以找到情绪(X,Y)。

如果你真的进入?- emotion(X,Y).,你会得到同样false.的答案。

例如,当您添加这些规则要求的一些事实时,assert(emotion(anxiety,prime)).您将获得X=anxiety Y=emotion.

(我认为你应该对“原始数据”和分类有不同的谓词。)

Prolog 允许检查程序,内置的主要“反身”是子句/2。在你的程序上:

?- clause(emotion(X,Y),Body).
X = anxiety,
Y = emotion,
Body = emotion(anxiety, prime) ;
X = fear,
Y = emotion,
Body = (emotion(anxiety, prime), emotion(when, prime), emotion(bad, prime)) ;
X = horrified,
Y = emotion,
Body = (emotion(surprise, prime), (emotion(fear, emotion);emotion(aversion, prime))).

这允许元解释程序(请参阅此处以获得清晰的介绍),并在提供“导航”工具后检查任何细节。当然,some kind of definition of anxiety必须详细说明这样的陈述:焦虑是否以原始方式发生,等等。

例如

?- [user].
|: occurs(E,emotion(E,_)).
|: occurs(E,(A,B)) :- occurs(E,A);occurs(E,B).
|: occurs(E,(A;B)) :- occurs(E,A);occurs(E,B).
|: % user://1 compiled 0,20 sec, 4 clauses
true.

?- findall(E, (clause(emotion(E,_),B), occurs(anxiety,B)),L).
L = [anxiety, fear].
于 2013-06-04T06:46:57.457 回答