a)编写一个谓词头/ 2(a r g l,arg2),它在argl中获取一个实例化的列表列表,并将arg2计算为子列表的头部列表。例如:
?- heads([[3, 8], [9], [1, 2, 3], [a, b, c]], L).
L = [3, 9, l, a]
b)充分定义两个输入;整数和整数列表。结果是一个列表 通过将列表中的每个整数乘以输入整数形成的整数。例如:
?- mply(5, [1, 2, 3], X).
X = [5, 10, 15]
c)编写一个名为compute(Expr,Value)的Prolog程序来计算 算术表达式Expr的值(值)。要求如下: •算术表达式可以是单个数字,也可以是[Exprl, 运营商,Expr2] •Exprl和Expr2是算术表达式 •运算符是原子加或原子减。 您的程序应该适用于以下查询:
?- compute(7, Val).
Val = 7
?- compute([2,plus,[9,minus,1]], Val).
Val = 10
我正在修改prolog,非常感谢任何帮助,谢谢
答案 0 :(得分:1)
对于a)和b),您需要遍历列表并执行简单计算。常规列表遍历的工作原理如下:
list_traverse([]).
list_traverse([H|T]) :- list_traverse(T).
因此,通常您的解决方案应该将输入和输出添加到上面的模式中。
具体来说,对于a)
heads([],[]).
heads([H|T],[HH|TT]) :- H = [HH|_], heads(T,TT).
和b)
mply(_,[],[]).
mply(X,[H|T],[HH|TT]) :- HH is X*H, mply(X,T,TT).
c)需要稍微复杂一点的处理,因为你必须区分加法和减法:
compute([Val],Val) :- number(Val).
compute([E1,plus,E2],Val) :- compute(E1,V1), compute(E2,V2), Val is V1+V2.
compute([E1,minus,E2],Val) :- compute(E1,V1), compute(E2,V2), Val is V1-V2.
答案 1 :(得分:1)
ad a)计算空列表的头部是什么意思?我假设谓词应该失败:
:- use_module(library(lambda)). list_heads(XXs, Xs) :- maplist(\[X|_]^X^true,XXs, Xs). mply(F, Xs, Zs) :- maplist(F+\X^Z^(Z is X*F), Xs, Zs). compute([I],Val) :- Val is I. compute([E1,plus,E2],Val) :- compute(E1,V1), compute(E2,V2), Val is V1+V2. compute([E1,minus,E2],Val) :- compute(E1,V1), compute(E2,V2), Val is V1-V2.
请注意,compute([_],V)
现在会发出instantiation_error
,这比默默地失败要好得多。