首页 > 解决方案 > prolog 函数,prolog 权重,prolog 项目

问题描述

features([explicit-0, danceability-1, energy-1,
          key-0, loudness-0, mode-1, speechiness-1,
          acousticness-1, instrumentalness-1,
          liveness-1, valence-1, tempo-0, duration_ms-0,
          time_signature-0]).
%this predicate filters the features and gives the filtered list as a result.

filter_features(Features, Filtered) :- 
    features(X), 
    filter_features_rec(Features, X, Filtered).

filter_features_rec([], [], []).
filter_features_rec([FeatHead|FeatTail], [Head|Tail], FilteredFeatures) :-
    filter_features_rec(FeatTail, Tail, FilteredTail),
    _-Use = Head,
    (
        (    Use is 1, 
             FilteredFeatures = [FeatHead|FilteredTail])
    ;
        (    Use is 0,
             FilteredFeatures = FilteredTail
        )
    ).   

这是如何运作的?这里 -use 的用途是什么?我无法解释 -0,-1 权重以及我们如何使用它们以及它们在这里的函数中代表什么?

标签: prolog

解决方案


“Keyword-Weight”表达式是pair,在这种情况下将Keyword链接到Weight

它们实际上是具有函子和 arity 2 的标准复合术语-,也可以这样写,就-(Keyword,Weight)好像这会破坏具有语法上可接受的写对方式的意义。

给定这样的一对,您可以将另一个术语与它统一,并在位置 1 或 2 处提取参数。

特别是这里:

_-Use = Head

Head隐含地知道是一对(尽管在编译时或运行时都没有检查 is),因为它是特征列表的头元素。它与 pair 统一_-Use,这意味着 pair 的第一个参数与匿名(和未绑定的)变量统一,这总是成功的Head_第二个参数与 统一Use,此时子句中的它是新鲜的且未绑定的,因此统一也成功了。Use现在绑定到整数权重。

之后,析取相当于一个排他分支,具体取决于Use: Useis 绑定到1, then FilteredFeatures = [FeatHead|FilteredTail]), ifUse绑定到0, then的绑定FilteredFeatures = FilteredTail


推荐阅读