我已经在互联网和StackOverflow上搜索了答案,但我不知道。我真的不知道如何使用Prolog,我觉得它真的很混乱。我脑子里有解决方案,但不能在Prolog中写出来,这非常令人沮丧。我一直陷入项目的第一步。
我需要说明一个将名称与列表相关联的事实,这样我每次想要用它来做事时都不必输入列表。
例如:
list(a, [1,2,3]).
然后每当我在谓词中使用a
时,参数就是列表。我不知道如何做到这一点,我已经有一个谓词,当我称之为
predicate([1,2,3]).
但是当我用
打电话时predicate(a).
它不起作用。我认为它不起作用,因为它将a
视为与列表无关的参数,这就是为什么我想知道是否宣布list(a, [1,2,3]).
关联a
这一事实的原因列表或我还需要做其他事情吗?提前致谢
答案 0 :(得分:1)
a
是一个原子,一个基本数据类型,而不是一个带有列表值的变量。 vanilla Prolog中也没有函数语法:a
永远不会被评估并替换为其他值。如果我们想要一个谓词来生成或存储一个值,我们可以通过用变量调用谓词并将变量绑定到谓词的一个参数来实现。
如果你想回忆一下列表[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中,当与顶级进行交互时,我们可以将$
附加到变量名称以调用它的最后一个实例化值。因此,如果我们已经运行了上述查询,我们可以为其他目的调用L
的最后一个值:
?- reverse($L, ReversedL).
答案 1 :(得分:1)
你应该学习Prolog的基本语法,因为它与WRT其他语言有一些根本的区别。既然你是基本的,我不会向你推销任何“魔法”,但这里有一些我为个人用途而烹饪的语法糖的例子。
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).
我不经常使用我的升降器模块,因为它使代码更难调试,并且语法增益相当小......
SWI-Prolog包提供了另一种选择(对不起,我从未使用过它......):请参阅包func。您是否使用SWI-Prolog,可以通过? - pack_install(func)来尝试。
答案 2 :(得分: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.