Swi-Prolog - 基于定义查找X.

时间:2013-06-04 02:44:55

标签: prolog

我正在使用Swi-Prolog,我认为这是一个有点奇怪的Prolog使用。我之所以说这是因为我不知道人们除了沃森之外通常会使用Prolog。

无论如何,我正在制作一个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产生这样的列表?

1 个答案:

答案 0 :(得分:0)

  

我能找到情感(X,Y)。

如果您确实输入了?- emotion(X,Y).,那么您只需false.作为答案。

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

(我认为你应该为'原始数据'和分类提供不同的谓词。)

Prolog允许检查程序,内置的主要“反身”是clause / 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))).

这允许元解释程序(请参阅here以获得明确的介绍),并在提供“导航”工具后检查任何细节。当然,像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].