0

a) 编写一个谓词 head/2 ( argl , arg2),它采用 argl 中列表的实例化列表,并将子列表的头列表计算为 arg2。例如:

?- heads([[3, 8], [9], [1, 2, 3], [a, b, c]], L).    
L = [3, 9, l, a]

b) 定义 mply 接受两个输入;整数和整数列表。结果是通过将列表中的每个整数乘以输入整数形成的整数列表。例如:

?- mply(5, [1, 2, 3], X).    
X = [5, 10, 15]

c) 编写一个名为 compute (Expr, Value) 的 Prolog 程序,它将计算算术表达式 Expr 的值 (Value)。要求如下: • 算术表达式可以是单个数字,也可以是 [Exprl, Operator, Expr2] 形式的列表 • Exprl 和 Expr2 是算术表达式 • 运算符是原子加号或原子减号。您的程序应该适用于以下查询:

?- compute(7, Val).
Val = 7

?- compute([2,plus,[9,minus,1]], Val).
Val = 10

我正在修改序言,非常感谢任何帮助,谢谢

4

2 回答 2

1

For a) and b) you are required to traverse a list and perform a simple computation. General list traversal works as follows:

list_traverse([]).
list_traverse([H|T]) :- list_traverse(T).

Hence, in general your solutions should add input and output to the schema above.

Specifically, for a)

heads([],[]).
heads([H|T],[HH|TT]) :- H = [HH|_], heads(T,TT).

and for b)

mply(_,[],[]).
mply(X,[H|T],[HH|TT]) :- HH is X*H, mply(X,T,TT).

c) requires a slightly more elaborate processing since you have to distinguish between addition and subtraction:

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.
于 2013-06-27T09:23:00.293 回答
1

ad a) 计算空列表的头部是什么意思?我假设谓词应该失败:

:- 使用模块(库(lambda))。

list_heads(XXs, Xs) :-
   地图列表(\[X|_]^X^true,XXs, Xs)。

mply(F, Xs, Zs) :-
   maplist(F+\X^Z^(Z 是 X*F), Xs, Zs)。

计算([I],Val):-
   瓦尔是我。
计算([E1,加,E2],Val):- 计算(E1,V1),计算(E2,V2),Val 是 V1+V2。
计算([E1,减号,E2],Val):- 计算(E1,V1),计算(E2,V2),Val 是 V1-V2。

请注意,compute([_],V)现在将发出一个instantiation_error比静默失败更好的主意。

于 2014-03-03T19:38:17.417 回答