1

我已经在整个互联网和 StackOverflow 上搜索了答案,但我不知道。我真的不明白如何使用 Prolog,我觉得它真的很混乱。我脑子里有解决方案,但无法在 Prolog 中编写它们,这非常令人沮丧。我一直停留在项目的第一步。

我需要说明一个将名称与列表相关联的事实,这样我就不必每次想用它做事时都键入列表。

例如:

list(a, [1,2,3]).

然后每当我a在谓词中使用时,参数就是列表。我不知道该怎么做,我已经有一个谓词,当我称它为

predicate([1,2,3]).

但是当我用

predicate(a).

它不起作用。我认为它不起作用,因为它被a视为与列表无关的参数,这就是为什么我想知道是声明与列表list(a, [1,2,3]). 关联的事实a还是我需要做其他任何事情?提前致谢

4

3 回答 3

1

你应该学习 Prolog 的基本语法,因为它与其他语言有一些根本区别。由于您是基础知识,因此我不会向您推销任何“魔术”,但这是我为个人使用而制作的一些语法糖的示例。

1 ?- [lifter].
% lifter compiled into lifter 0.08 sec, 12 clauses
true.

2 ?- [user].
|: a([1,2,3]).
% user://1 compiled 0.01 sec, 2 clauses
true.

3 ?- reverse(a(°),L).
L = [3, 2, 1].

原子°是“升降机”:上面的查询 3 被转换为读取

?- a(X), reverse(X,L).

我不经常使用我的 lifter 模块,因为它使代码更难调试,而且语法增益相当小......

SWI-Prolog 包提供了另一种选择(抱歉,我从未使用过它......):请参阅 pack func。您是否使用 SWI-Prolog,您可以通过 -pack_install(func) 进行尝试。

于 2013-11-01T23:02:25.773 回答
1

a是一个原子,一种基本数据类型,而不是具有列表值的变量。vanilla Prolog 中也没有功能语法:a将永远不会被评估和替换为其他值。如果我们想要一个谓词生成或存储一个值,我们通过使用变量调用谓词并将变量绑定到谓词的参数之一来实现。

如果您想调用 list [1,2,3],您只需包含一个断言此列表的事实:

a([1,2,3]).

然后,如果要查询涉及此列表的谓词,

?- a(L), length(L, N). 

首先我们将变量 L 与谓词确定的值a/1(意思是 'a 是一个 1-ariy 谓词')统一,然后我们要求将 L 的长度与变量 N 统一。

如果您想用不同的指示符命名列表,如list/2您上面写的谓词所示,您可以这样做,只是您会以与您尝试不同的方式回忆这些值。鉴于这些事实,

list(a, [1,2,3]).
list(b, [3,2,1]).

?- list(a, X), list(b, Y).
X = [1, 2, 3],
Y = [3, 2, 1].

注意:在 SWI-Prolog 中,当与顶层交互时,我们可以将 a 附加$到变量名称以调用它的最后实例化值。因此,如果我们已经运行了上述查询,我​​们可以调用 的最后一个值L用于其他目的:

?- reverse($L, ReversedL).
于 2013-11-01T21:44:51.437 回答
0

这是将列表绑定到变量的两种方法。第一个是预定义的事实,其中事实“a”的内容被统一/放入变量“A”中 - 注意变量必须以大写字母开头。

第二种方法是直接定义包含列表的变量,如下面的“B”所示。

下面的“useit”谓词的目的只是表明可以传递和使用变量。在这种情况下,两个列表都会显示。

% predefined fact
a([1,2,3]).

useit(MyList) :-
    write(MyList).

declareit :-

    % declare variable 'A' from fact 'a'
    a(A),
    useit(A),

    % Declare B in real time, possibly from prior computation
    B = [3,4,5],
    useit(B).


?- declareit.
[1,2,3][3,4,5]
true.
于 2013-11-02T11:48:39.307 回答